剛才不小心看到一个超级厉害的中国人!!!据说在开发中国的操作系统呢...
主题:sepl语言的yacc&lex词法和语法定义文件
admin1000 [sjm@seekit-online.com] 发表于2005/02/19 15:30:26 阅读次数[77]
这是本站曾经设计的sepl.l和sepl.y文件,并用yacc&lex生成了c文件,完成了词法分析和语法分析器自动生成。因为没有最后采用,经网友提出yacc&lex不支持中文,特公布如下:
当然要让编译器使用,还要增加一些函数,可以参考编译原理这本书。
%{
/**************************************************************/
/* 2003.8.31 sepl.l XXX设计 */
/* sepl语言严格词法 */
/* 词法分析可以分析ASCII和unicode字符*/
/**************************************************************/
#include
%}
UniCHAR [\xC0-\xFF]
Separator [\(\)\{\}\[\]\;\,\.]
Delimiter1 [\=\>\<\+\-\*\/\%]
HexDigit [0-9a-fA-F]
Digit [0-9]
NonZeroDigit [1-9]
Letter [a-zA-Z_]
AnyButSlash [^\/]
AnyButAstr [^\*]
BLK [\b]
TAB [\t]
FF [\f]
ESCCHR [\\]
CR [\r]
LF [\n]
Escape [\\]([r]|[n]|[b]|[f]|[t]|[\\])
IdentChar [Letter|UniCHAR]
Identifier {IdentChar}({IdentChar}|{Digit})*
Comment1 [\/][\*][注释]({AnyButAstr}|[\*]{AnyButSlash})*[\*][\/]
Comment2 [\/][\/][注释].*
Comment ({Comment1}|{Comment2})
WhiteSpace ({CR}|{LF}|{FF}|{TAB}|{BLK}|[ ])
Dimension [\[]({WhiteSpace}|{Comment})*[\]]
DecimalNum {NonZeroDigit}{Digit}*
HexNum [0]([x]|[X]){HexDigit}{HexDigit}*
IntegerLiteral ({DecimalNum}|{HexNum})
Sign ([\+]|[\-])
SignedInt {Sign}?{Digit}+
Expo ([e]|[E])
ExponentPart {Expo}{SignedInt}?
Float1 {Digit}+[\.]{Digit}+?{ExponentPart}?
Float2 {Digit}+{ExponentPart}
Float3 {Digit}+
FloatingPoint ({Float1}|{Float2}|{Float3})
AnyChrChr [^\\']
AnyStrChr [^\\"]
Character [\']({Escape}|{AnyChrChr})[\']
String [\"]({Escape}|{AnyStrChr})*[\"]
Numeric ({IntegerLiteral}|{FloatingPoint})
Literal ({Numeric}|{Character}|{String})
%%
"真" {return LITERAL;}
"假" {return LITERAL;}
{Separator} {return yytext[0];}
{Delimiter1} {return yytext[0];}
{Dimension} {return OP_DIM;}
"==" {return OP_EQ;}
"<=" {return OP_LE;}
">=" {return OP_GE;}
"<>" {return OP_NE;}
"->" {return POINTERTO;}
"非" {return OP_LNOT;}
"并且" {return OP_LAND;}
"或" {return OP_LOR;}
"位与" {return OP_BITAND;}
"位或" {return OP_BITOR;}
"位异或" {return OP_BITXOR;}
"左移位数" {return OP_BITFHITFLEFT;}
"右移位数" {return OP_BITSHIFTRIGHT;}
"取反" {return OP_BITNOT;}
"布尔值" {return KW_BOOLEAN;}
"包含" {return KW_INCLUDE;}
"指针" {return KW_POINTER;}
"解释" {return KW_EXPLAIN;}
"函数" {return KW_FUNCTION;}
"传值" {return KW_BYVALUE;}
"传址" {return KW_BYADDRESS;}
"类" {return KW_CLASS;}
"公开数据" {return KW_PUBLICDATA;}
"公开函数" {return KW_PUBLICFUNCTION;}
"私有数据" {return KW_PRIVATEDATA;}
"私有函数" {return KW_PRIVATEFUNCTION;}
"变量定义" {return KW_VARIABLEDEFINE;}
"函数开始" {return KW_FUNCTIONBEGIN;}
"函数结束" {return KW_FUNCTIONEND;}
"字符" {return KW_CHAR;}
"字节" {return KW_BYTE;}
"小整数" {return KW_SHORTINTEGER;}
"小正整数" {return KW_SHORTUNSIGNEDINT;}
"整数" {return KW_INTEGER;}
"正整数" {return KW_UNSIGNEDINTEGER;}
"浮点数" {return KW_FLOAT;}
"双倍浮点数" {return KW_DOUBLEFLOAT;}
"超大浮点数" {return KW_SUPERFLOAT;}
"选择" {return KW_SWITCH;}
"匹配" {return KW_CASE;}
"其他" {return KW_DEFAULT;}
"如果" {return KW_IF;}
"那么" {return KW_THEN;}
"否则" {return KW_ELSE;}
"当" {return KW_WHEN;}
"循环" {return KW_LOOP;}
"直到" {return KW_UNTIL;}
"从" {return KW_FROM;}
"到" {return KW_TO;}
"跳转标号" {return KW_GOTO;}
"中断" {return KW_BREAK;}
"继续" {return KW_CONTINUE;}
"返回" {return KW_RETURN;}
"抛出异常" {return KW_THROW;}
"捕捉异常" {return KW_TRY;}
"捉到异常" {return KW_CATCH;}
"最后处理" {return KW_FINAL;}
"取地址" {return KW_ADDR;}
"指针值" {return KW_POINERTVALUE;}
"类型转换" {return KW_TYPECONVERT;}
"继承自" {return KW_INHERITFROM;}
"返回值类型" {return KW_RETURNTYPE;}
"新建" {return KW_NEW;}
"释放" {return KW_FREE;}
"类型是" {return OP_TYPENAMEIS;}
{Identifier} {return IDENTIFIER;}
{Literal} {return LITERAL;}
{WhiteSpace} {}
{Comment} {}
%%
%%
%{