summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-01-02 15:13:07 -0500
committerJune McEnroe <june@causal.agency>2021-01-02 15:13:07 -0500
commitc709509129b4cc22bd47396ed5f6e8b4dc36b9fc (patch)
tree014c07d19d49e36d2967f39c6afa58262c293764
parentTag top-level typedefs the same way as function definitions (diff)
downloadsrc-c709509129b4cc22bd47396ed5f6e8b4dc36b9fc.tar.gz
src-c709509129b4cc22bd47396ed5f6e8b4dc36b9fc.zip
Clean up make lexer
Still feels pretty messy though.
-rw-r--r--bin/hilex/make.l27
1 files changed, 17 insertions, 10 deletions
diff --git a/bin/hilex/make.l b/bin/hilex/make.l
index e7961eb8..e9d3c84d 100644
--- a/bin/hilex/make.l
+++ b/bin/hilex/make.l
@@ -25,14 +25,15 @@
 %x Interp Shell
 
 ident [._[:alnum:]]+
-target [-/._[:alnum:]]+
-assign [!+:?]?=
+assign [+?:!]?=
+target [-._/?*\[\][:alnum:]]+
+operator [:!]|::
 
 %%
 	static int pop = INITIAL;
 	static int depth = 0;
 
-^"\t" {
+^"\t"+ {
 	BEGIN(pop = Shell);
 	return Normal;
 }
@@ -41,12 +42,15 @@ assign [!+:?]?=
 		BEGIN(pop = INITIAL);
 		return Normal;
 	}
-	[^\n$]+|. { return Normal; }
+	"\\\n" { return Normal; }
+	[^\\\n$]+|. { return Normal; }
 }
 
-[[:blank:]] { return Normal; }
+[[:blank:]]+ { return Normal; }
 
-"."(PHONY|PRECIOUS|SUFFIXES)/":"? {
+{operator} { return Operator; }
+
+"."(PHONY|PRECIOUS|SUFFIXES)/{operator}? {
 	return Keyword;
 }
 
@@ -63,16 +67,19 @@ assign [!+:?]?=
 		BEGIN(pop = INITIAL);
 		return Normal;
 	}
-	[^$[:space:]]+ { return String; }
+	"\\\n" { return String; }
+	[^\\$[:space:]]+|. { return String; }
 }
 
-{target}([[:blank:]]+{target})*/":" {
+^"-"?include { return Macro; }
+
+{target}([[:blank:]]+{target})*/{operator} {
 	return IdentifierTag;
 }
 
-^"-"?include { return Macro; }
+{target} { return Identifier; }
 
-"#".* { return Comment; }
+"#"([^\\\n]|"\\"[^\n]|"\\\n")* { return Comment; }
 
 <*>{
 	"$"("{"|"(") {