1616
1717from src .ply import lex
1818
19- from .prepro .definestable import DefinesTable
20- from .base_pplex import BaseLexer
21-
19+ from src .zxbpp .prepro .definestable import DefinesTable
20+ from src .zxbpp .base_pplex import BaseLexer , ReservedDirectives
2221
2322EOL = "\n "
2423
3635 ("defexpr" , "exclusive" ),
3736 ("msg" , "exclusive" ),
3837 ("pragma" , "exclusive" ),
38+ ("if" , "exclusive" ),
3939 ("singlecomment" , "exclusive" ),
4040 ("asmcomment" , "exclusive" ),
4141)
4242
4343_tokens = (
44+ "AND" ,
45+ "OR" ,
4446 "STRING" ,
4547 "TEXT" ,
4648 "TOKEN" ,
6062 "CONTINUE" ,
6163 "NUMBER" ,
6264 "SEPARATOR" ,
65+ "GT" ,
66+ "GE" ,
67+ "LT" ,
68+ "LE" ,
69+ "NE" ,
6370 "PASTE" ,
71+ "STRINGIZING" ,
6472)
6573
66- reserved_directives = {
67- "include" : "INCLUDE" ,
68- "once" : "ONCE" ,
69- "define" : "DEFINE" ,
70- "undef" : "UNDEF" ,
71- "ifdef" : "IFDEF" ,
72- "ifndef" : "IFNDEF" ,
73- "else" : "ELSE" ,
74- "endif" : "ENDIF" ,
75- "init" : "INIT" ,
76- "line" : "LINE" ,
77- "require" : "REQUIRE" ,
78- "pragma" : "PRAGMA" ,
79- "error" : "ERROR" ,
80- "warning" : "WARNING" ,
81- }
8274
8375# List of token names.
84- tokens = _tokens + tuple (reserved_directives . values () )
76+ tokens = _tokens + tuple (x . value for x in ReservedDirectives )
8577
8678__COMMENT_LEVEL = 0
8779
@@ -130,7 +122,7 @@ def t_INITIAL_TOKEN(self, t):
130122 r"[][}{%'`,.:$()*/<>~&|+^-]"
131123 return t
132124
133- def t_line_singlecomment_asmcomment_prepro_define_defargs_defargsopt_defexpr_pragma_NEWLINE (self , t ):
125+ def t_line_singlecomment_asmcomment_prepro_define_defargs_defargsopt_defexpr_pragma_if_NEWLINE (self , t ):
134126 r"\r?\n"
135127 t .lexer .lineno += 1
136128 t .lexer .pop_state ()
@@ -153,26 +145,50 @@ def t_singlecomment_comment_Skip(self, t):
153145 pass
154146
155147 # Allows line breaking
156- def t_defexpr_CONTINUE (self , t ):
157- r"[\\_]\r?\n"
158- t .lexer .lineno += 1
159- return t
160-
161- def t_line_prepro_pragma_defargs_define_skip (self , t ):
148+ def t_line_prepro_pragma_defargs_define_skip_if (self , t ):
162149 r"[ \t]+"
163150 pass # Ignore whitespaces and tabs
164151
152+ def t_if_EQ (self , t ):
153+ r"=="
154+ return t
155+
156+ def t_if_NE (self , t ):
157+ r"!=|<>"
158+ return t
159+
160+ def t_if_GE (self , t ):
161+ r">="
162+ return t
163+
164+ def t_if_GT (self , t ):
165+ r">"
166+ return t
167+
168+ def t_if_LE (self , t ):
169+ r"<="
170+ return t
171+
172+ def t_if_LT (self , t ):
173+ r"<"
174+ return t
175+
176+ def t_if_AND (self , t ):
177+ r"&&"
178+ return t
179+
180+ def t_if_OR (self , t ):
181+ r"\|\|"
182+ return t
183+
165184 def t_prepro_ID (self , t ):
166185 r"[._a-zA-Z][._a-zA-Z0-9]*" # preprocessor directives
167- t .type = reserved_directives .get (t .value .lower (), "ID" )
168- if t .type == "DEFINE" :
169- t .lexer .begin ("define" )
170- elif t .type == "PRAGMA" :
171- t .lexer .begin ("pragma" )
172- elif t .type == "LINE" :
173- t .lexer .begin ("line" )
174- elif t .type in ("ERROR" , "WARNING" ):
175- t .lexer .begin ("msg" )
186+ t .type = self .reserved_directives .get (t .value , "ID" )
187+ states_ = {"DEFINE" : "define" , "ERROR" : "msg" , "IF" : "if" , "LINE" : "line" , "PRAGMA" : "pragma" , "WARNING" : "msg" }
188+
189+ if t .type in states_ :
190+ t .lexer .begin (states_ [t .type ])
191+
176192 return t
177193
178194 def t_msg_TEXT (self , t ):
@@ -198,6 +214,19 @@ def t_defexpr_RRP(self, t):
198214 r"\)"
199215 return t
200216
217+ def t_defexpr_CONTINUE (self , t ):
218+ r"[\\_]\r?\n"
219+ t .lexer .lineno += 1
220+ return t
221+
222+ def t_defexpr_STRINGIZING (self , t ):
223+ r"\#[ \t]*"
224+ return t
225+
226+ def t_defexpr_PASTE (self , t ):
227+ r"[ \t]*\#\#[ \t]*"
228+ return t
229+
201230 def t_pragma_ID (self , t ):
202231 r"[_a-zA-Z][_a-zA-Z0-9]*" # pragma directives
203232 if t .value .upper () in ("PUSH" , "POP" ):
@@ -323,7 +352,7 @@ def t_line_defargs_defargsopt_prepro_define_defexpr_pragma_singlecomment_INITIAL
323352 r"."
324353 self .error ("illegal preprocessor character '%s'" % t .value [0 ])
325354
326- def t_line_msg_defargs_defargsopt_prepro_define_defexpr_pragma_singlecomment_INITIAL_asmcomment_error (self , t ):
355+ def t_if_line_msg_defargs_defargsopt_prepro_define_defexpr_pragma_singlecomment_INITIAL_asmcomment_error (self , t ):
327356 """error handling rule. This should never happens!"""
328357 pass # The lexer will raise an exception here. This is intended
329358
0 commit comments