summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--bin/hilex/c.l55
1 files changed, 26 insertions, 29 deletions
diff --git a/bin/hilex/c.l b/bin/hilex/c.l
index ea29abb8..c0bd516d 100644
--- a/bin/hilex/c.l
+++ b/bin/hilex/c.l
@@ -21,21 +21,36 @@
 #include "hilex.h"
 %}
 
-%x MacroLine MacroInclude
+%s MacroLine MacroInclude
 %x CharLiteral StringLiteral
 
+ident [_[:alpha:]][_[:alnum:]]*
 width "*"|[0-9]+
 
 %%
 	static int pop = INITIAL;
 
-[[:space:]]+ { return Normal; }
+[[:blank:]]+ { return Normal; }
 
-^"%" {
+^"#"[[:blank:]]*("include"|"import") {
+	BEGIN(pop = MacroInclude);
+	return Macro;
+}
+^[#%][[:blank:]]*{ident} {
 	BEGIN(pop = MacroLine);
 	return Macro;
 }
 
+<MacroInclude>"<"[^>]+">" { return String; }
+
+<MacroLine,MacroInclude>{
+	"\n" {
+		BEGIN(pop = INITIAL);
+		return Normal;
+	}
+	"\\\n" { return Macro; }
+}
+
 ([-+*/%&|^=!<>]|"<<"|">>")"="? |
 [=~.?:]|"++"|"--"|"&&"|"||"|"->" |
 sizeof|(_A|alignof) {
@@ -55,18 +70,19 @@ register|restrict|return|static|struct|switch|typedef|union|volatile|while |
 	return Keyword;
 }
 
-[_[:alpha:]][_[:alnum:]]* { return Identifier; }
+<MacroLine,MacroInclude>{ident} { return Macro; }
+{ident} { return Identifier; }
 
-<INITIAL,MacroLine>"//"([^\n]|"\\\n")* |
-<INITIAL,MacroLine>"/*"([^*]|"*"[^/])*"*"+"/" {
+"//"([^\n]|"\\\n")* |
+"/*"([^*]|"*"[^/])*"*"+"/" {
 	return Comment;
 }
 
-<INITIAL,MacroLine>[LUu]?"'" {
+[LUu]?"'" {
 	BEGIN(CharLiteral);
 	return String;
 }
-<INITIAL,MacroLine,MacroInclude>([LU]|u8?)?"\"" {
+([LU]|u8?)?"\"" {
 	BEGIN(StringLiteral);
 	return String;
 }
@@ -102,28 +118,9 @@ register|restrict|return|static|struct|switch|typedef|union|volatile|while |
 	[^%\\""]+|. { return String; }
 }
 
-^"#" {
-	BEGIN(pop = MacroLine);
-	return Macro;
-}
-^"#"[[:blank:]]*("include"|"import") {
-	BEGIN(pop = MacroInclude);
-	return Macro;
-}
-<MacroInclude>"<"[^>]+">" {
-	BEGIN(pop = MacroLine);
-	return String;
-}
-<MacroLine,MacroInclude>{
-	"\n" {
-		BEGIN(pop = INITIAL);
-		return Macro;
-	}
-	"\\\n" { return Macro; }
-	[^\\\n/<>''""]+|. { return Macro; }
-}
+<MacroLine,MacroInclude>. { return Macro; }
 
-. { return Normal; }
+.|\n { return Normal; }
 
 %{
 	(void)yyunput;