📄 clex.py
字号:
# ----------------------------------------------------------------------# clex.py## A lexer for ANSI C.# ----------------------------------------------------------------------import lex# Reserved wordsreserved = ( 'AUTO', 'BREAK', 'CASE', 'CHAR', 'CONST', 'CONTINUE', 'DEFAULT', 'DO', 'DOUBLE', 'ELSE', 'ENUM', 'EXTERN', 'FLOAT', 'FOR', 'GOTO', 'IF', 'INT', 'LONG', 'REGISTER', 'RETURN', 'SHORT', 'SIGNED', 'SIZEOF', 'STATIC', 'STRUCT', 'SWITCH', 'TYPEDEF', 'UNION', 'UNSIGNED', 'VOID', 'VOLATILE', 'WHILE', )tokens = reserved + ( # Literals (identifier, integer constant, float constant, string constant, char const) 'ID', 'TYPEID', 'ICONST', 'FCONST', 'SCONST', 'CCONST', # Operators (+,-,*,/,%,|,&,~,^,<<,>>, ||, &&, !, <, <=, >, >=, ==, !=) 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD', 'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT', 'LOR', 'LAND', 'LNOT', 'LT', 'LE', 'GT', 'GE', 'EQ', 'NE', # Assignment (=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=) 'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL', 'PLUSEQUAL', 'MINUSEQUAL', 'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL', 'OREQUAL', # Increment/decrement (++,--) 'PLUSPLUS', 'MINUSMINUS', # Structure dereference (->) 'ARROW', # Conditional operator (?) 'CONDOP', # Delimeters ( ) [ ] { } , . ; : 'LPAREN', 'RPAREN', 'LBRACKET', 'RBRACKET', 'LBRACE', 'RBRACE', 'COMMA', 'PERIOD', 'SEMI', 'COLON', # Ellipsis (...) 'ELLIPSIS', )# Completely ignored characterst_ignore = ' \t\x0c'# Newlinesdef t_NEWLINE(t): r'\n+' t.lineno += t.value.count("\n") # Operatorst_PLUS = r'\+'t_MINUS = r'-'t_TIMES = r'\*'t_DIVIDE = r'/'t_MOD = r'%'t_OR = r'\|'t_AND = r'&'t_NOT = r'~'t_XOR = r'^'t_LSHIFT = r'<<'t_RSHIFT = r'>>'t_LOR = r'\|\|'t_LAND = r'&&'t_LNOT = r'!'t_LT = r'<'t_GT = r'>'t_LE = r'<='t_GE = r'>='t_EQ = r'=='t_NE = r'!='# Assignment operatorst_EQUALS = r'='t_TIMESEQUAL = r'\*='t_DIVEQUAL = r'/='t_MODEQUAL = r'%='t_PLUSEQUAL = r'\+='t_MINUSEQUAL = r'-='t_LSHIFTEQUAL = r'<<='t_RSHIFTEQUAL = r'>>='t_ANDEQUAL = r'&='t_OREQUAL = r'\|='t_XOREQUAL = r'^='# Increment/decrementt_PLUSPLUS = r'\+\+'t_MINUSMINUS = r'--'# ->t_ARROW = r'->'# ?t_CONDOP = r'\?'# Delimeterst_LPAREN = r'\('t_RPAREN = r'\)'t_LBRACKET = r'\['t_RBRACKET = r'\]'t_LBRACE = r'\{'t_RBRACE = r'\}'t_COMMA = r','t_PERIOD = r'\.'t_SEMI = r';'t_COLON = r':'t_ELLIPSIS = r'\.\.\.'# Identifiers and reserved wordsreserved_map = { }for r in reserved: reserved_map[r.lower()] = rdef t_ID(t): r'[A-Za-z_][\w_]*' t.type = reserved_map.get(t.value,"ID") return t# Integer literalt_ICONST = r'\d+([uU]|[lL]|[uU][lL]|[lL][uU])?'# Floating literalt_FCONST = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?'# String literalt_SCONST = r'\"([^\\\n]|(\\.))*?\"'# Character constant 'c' or L'c't_CCONST = r'(L)?\'([^\\\n]|(\\.))*?\''# Commentsdef t_comment(t): r' /\*(.|\n)*?\*/' t.lineno += t.value.count('\n')# Preprocessor directive (ignored)def t_preprocessor(t): r'\#(.)*?\n' t.lineno += 1 def t_error(t): print "Illegal character %s" % repr(t.value[0]) t.skip(1) lexer = lex.lex(optimize=1)if __name__ == "__main__": lex.runmain(lexer)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -