Mercurial > repo
comparison ply-3.8/example/ansic/clex.py @ 7267:343ff337a19b
<ais523> ` tar -xf ply-3.8.tar.gz
author | HackBot |
---|---|
date | Wed, 23 Mar 2016 02:40:16 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
7266:61a39a120dee | 7267:343ff337a19b |
---|---|
1 # ---------------------------------------------------------------------- | |
2 # clex.py | |
3 # | |
4 # A lexer for ANSI C. | |
5 # ---------------------------------------------------------------------- | |
6 | |
7 import sys | |
8 sys.path.insert(0,"../..") | |
9 | |
10 import ply.lex as lex | |
11 | |
12 # Reserved words | |
13 reserved = ( | |
14 'AUTO', 'BREAK', 'CASE', 'CHAR', 'CONST', 'CONTINUE', 'DEFAULT', 'DO', 'DOUBLE', | |
15 'ELSE', 'ENUM', 'EXTERN', 'FLOAT', 'FOR', 'GOTO', 'IF', 'INT', 'LONG', 'REGISTER', | |
16 'RETURN', 'SHORT', 'SIGNED', 'SIZEOF', 'STATIC', 'STRUCT', 'SWITCH', 'TYPEDEF', | |
17 'UNION', 'UNSIGNED', 'VOID', 'VOLATILE', 'WHILE', | |
18 ) | |
19 | |
20 tokens = reserved + ( | |
21 # Literals (identifier, integer constant, float constant, string constant, char const) | |
22 'ID', 'TYPEID', 'ICONST', 'FCONST', 'SCONST', 'CCONST', | |
23 | |
24 # Operators (+,-,*,/,%,|,&,~,^,<<,>>, ||, &&, !, <, <=, >, >=, ==, !=) | |
25 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD', | |
26 'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT', | |
27 'LOR', 'LAND', 'LNOT', | |
28 'LT', 'LE', 'GT', 'GE', 'EQ', 'NE', | |
29 | |
30 # Assignment (=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=) | |
31 'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL', 'PLUSEQUAL', 'MINUSEQUAL', | |
32 'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL', 'OREQUAL', | |
33 | |
34 # Increment/decrement (++,--) | |
35 'PLUSPLUS', 'MINUSMINUS', | |
36 | |
37 # Structure dereference (->) | |
38 'ARROW', | |
39 | |
40 # Conditional operator (?) | |
41 'CONDOP', | |
42 | |
43 # Delimeters ( ) [ ] { } , . ; : | |
44 'LPAREN', 'RPAREN', | |
45 'LBRACKET', 'RBRACKET', | |
46 'LBRACE', 'RBRACE', | |
47 'COMMA', 'PERIOD', 'SEMI', 'COLON', | |
48 | |
49 # Ellipsis (...) | |
50 'ELLIPSIS', | |
51 ) | |
52 | |
53 # Completely ignored characters | |
54 t_ignore = ' \t\x0c' | |
55 | |
56 # Newlines | |
57 def t_NEWLINE(t): | |
58 r'\n+' | |
59 t.lexer.lineno += t.value.count("\n") | |
60 | |
61 # Operators | |
62 t_PLUS = r'\+' | |
63 t_MINUS = r'-' | |
64 t_TIMES = r'\*' | |
65 t_DIVIDE = r'/' | |
66 t_MOD = r'%' | |
67 t_OR = r'\|' | |
68 t_AND = r'&' | |
69 t_NOT = r'~' | |
70 t_XOR = r'\^' | |
71 t_LSHIFT = r'<<' | |
72 t_RSHIFT = r'>>' | |
73 t_LOR = r'\|\|' | |
74 t_LAND = r'&&' | |
75 t_LNOT = r'!' | |
76 t_LT = r'<' | |
77 t_GT = r'>' | |
78 t_LE = r'<=' | |
79 t_GE = r'>=' | |
80 t_EQ = r'==' | |
81 t_NE = r'!=' | |
82 | |
83 # Assignment operators | |
84 | |
85 t_EQUALS = r'=' | |
86 t_TIMESEQUAL = r'\*=' | |
87 t_DIVEQUAL = r'/=' | |
88 t_MODEQUAL = r'%=' | |
89 t_PLUSEQUAL = r'\+=' | |
90 t_MINUSEQUAL = r'-=' | |
91 t_LSHIFTEQUAL = r'<<=' | |
92 t_RSHIFTEQUAL = r'>>=' | |
93 t_ANDEQUAL = r'&=' | |
94 t_OREQUAL = r'\|=' | |
95 t_XOREQUAL = r'\^=' | |
96 | |
97 # Increment/decrement | |
98 t_PLUSPLUS = r'\+\+' | |
99 t_MINUSMINUS = r'--' | |
100 | |
101 # -> | |
102 t_ARROW = r'->' | |
103 | |
104 # ? | |
105 t_CONDOP = r'\?' | |
106 | |
107 # Delimeters | |
108 t_LPAREN = r'\(' | |
109 t_RPAREN = r'\)' | |
110 t_LBRACKET = r'\[' | |
111 t_RBRACKET = r'\]' | |
112 t_LBRACE = r'\{' | |
113 t_RBRACE = r'\}' | |
114 t_COMMA = r',' | |
115 t_PERIOD = r'\.' | |
116 t_SEMI = r';' | |
117 t_COLON = r':' | |
118 t_ELLIPSIS = r'\.\.\.' | |
119 | |
120 # Identifiers and reserved words | |
121 | |
122 reserved_map = { } | |
123 for r in reserved: | |
124 reserved_map[r.lower()] = r | |
125 | |
126 def t_ID(t): | |
127 r'[A-Za-z_][\w_]*' | |
128 t.type = reserved_map.get(t.value,"ID") | |
129 return t | |
130 | |
131 # Integer literal | |
132 t_ICONST = r'\d+([uU]|[lL]|[uU][lL]|[lL][uU])?' | |
133 | |
134 # Floating literal | |
135 t_FCONST = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?' | |
136 | |
137 # String literal | |
138 t_SCONST = r'\"([^\\\n]|(\\.))*?\"' | |
139 | |
140 # Character constant 'c' or L'c' | |
141 t_CCONST = r'(L)?\'([^\\\n]|(\\.))*?\'' | |
142 | |
143 # Comments | |
144 def t_comment(t): | |
145 r'/\*(.|\n)*?\*/' | |
146 t.lexer.lineno += t.value.count('\n') | |
147 | |
148 # Preprocessor directive (ignored) | |
149 def t_preprocessor(t): | |
150 r'\#(.)*?\n' | |
151 t.lexer.lineno += 1 | |
152 | |
153 def t_error(t): | |
154 print("Illegal character %s" % repr(t.value[0])) | |
155 t.lexer.skip(1) | |
156 | |
157 lexer = lex.lex() | |
158 if __name__ == "__main__": | |
159 lex.runmain(lexer) | |
160 | |
161 | |
162 | |
163 | |
164 |