diff options
author | June McEnroe <june@causal.agency> | 2020-12-29 18:37:17 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-12-29 18:37:17 -0500 |
commit | 2901b90df2243e7844106cff525967b1d3305a8b (patch) | |
tree | e5bf4770e749599d47aab7ad11d2bd3b9917881d /bin/hilex | |
parent | Clean up hilex code somewhat (diff) | |
download | src-2901b90df2243e7844106cff525967b1d3305a8b.tar.gz src-2901b90df2243e7844106cff525967b1d3305a8b.zip |
Clean up C lexer
This ordering of rules feels much cleaner.
Diffstat (limited to '')
-rw-r--r-- | bin/hilex/c.l | 85 |
1 files changed, 42 insertions, 43 deletions
diff --git a/bin/hilex/c.l b/bin/hilex/c.l index 1c703814..55f50f09 100644 --- a/bin/hilex/c.l +++ b/bin/hilex/c.l @@ -30,45 +30,15 @@ width "*"|[0-9]+ %% static int pop = INITIAL; - static int braces = 0; + static int depth = 0; [[:blank:]]+ { return Normal; } -^"#"[[:blank:]]*("include"|"import") { - BEGIN(pop = MacroInclude); - return Macro; -} -^"#"[[:blank:]]*"define" { - BEGIN(pop = MacroDefine); - return Macro; -} -^[#%][[:blank:]]*{ident} | -^"%"[%{}] { +^"%"[%{}]? { BEGIN(pop = MacroLine); return Macro; } -<MacroInclude>"<"[^>]+">" { return String; } - -<MacroDefine>{ - {ident}/"(" { - BEGIN(pop = MacroLine); - return IdentifierTag; - } - {ident} { - BEGIN(pop = MacroLine); - return Macro; - } -} - -<MacroLine,MacroInclude,MacroDefine>{ - "\n" { - BEGIN(pop = INITIAL); - return Normal; - } - "\\\n" { return Macro; } -} - ([-+*/%&|^=!<>]|"<<"|">>")"="? | [=~.?:]|"++"|"--"|"&&"|"||"|"->" | sizeof|(_A|alignof) { @@ -101,12 +71,45 @@ register|restrict|return|static|struct|switch|typedef|union|volatile|while | return Keyword; } -<MacroLine>{ident} { return Macro; } +^"#"[[:blank:]]*(include|import) { + BEGIN(pop = MacroInclude); + return Macro; +} +^"#"[[:blank:]]*define { + BEGIN(pop = MacroDefine); + return Macro; +} +^"#"[[:blank:]]*{ident} { + BEGIN(pop = MacroLine); + return Macro; +} + +<MacroInclude>"<"[^>]+">" { + return String; +} +<MacroDefine>{ident}/"(" { + BEGIN(pop = MacroLine); + return IdentifierTag; +} +<MacroDefine>{ident} { + BEGIN(pop = MacroLine); + return Macro; +} + +<MacroLine,MacroInclude,MacroDefine>{ + "\n" { + BEGIN(pop = INITIAL); + return Normal; + } + "\\\n" { return Macro; } + {ident} { return Macro; } +} + {ident} { return Identifier; } {ident}/("["[^]]*"]")*[[:space:]]*"=" | {ident}/"("[^)]*")"[[:space:]]*"{" { - return (!braces ? IdentifierTag : Identifier); + return (!depth ? IdentifierTag : Identifier); } "//"([^\n]|"\\\n")* | @@ -154,16 +157,12 @@ register|restrict|return|static|struct|switch|typedef|union|volatile|while | [^%\\""]+|. { return String; } } -"{" { - braces++; - REJECT; -} -"}" { - braces--; - REJECT; -} +"{" { depth++; REJECT; } +"}" { depth--; REJECT; } -<MacroLine,MacroInclude,MacroDefine>. { return Macro; } +<MacroLine,MacroInclude,MacroDefine>. { + return Macro; +} .|\n { return Normal; } |