From 7c70322c7c8e88af93375b89146b0cd6cb8cc7f0 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Tue, 29 Dec 2020 22:39:16 -0500 Subject: Add make lexer This is kind of a mess and needs to be cleaned up against more careful reading of the make grammar. --- bin/hilex/make.l | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 bin/hilex/make.l (limited to 'bin/hilex/make.l') diff --git a/bin/hilex/make.l b/bin/hilex/make.l new file mode 100644 index 00000000..e7961eb8 --- /dev/null +++ b/bin/hilex/make.l @@ -0,0 +1,102 @@ +/* Copyright (C) 2020 C. McEnroe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +%option prefix="make" +%option noyywrap + +%{ +#include "hilex.h" +%} + +%s Assign +%x Interp Shell + +ident [._[:alnum:]]+ +target [-/._[:alnum:]]+ +assign [!+:?]?= + +%% + static int pop = INITIAL; + static int depth = 0; + +^"\t" { + BEGIN(pop = Shell); + return Normal; +} +{ + "\n" { + BEGIN(pop = INITIAL); + return Normal; + } + [^\n$]+|. { return Normal; } +} + +[[:blank:]] { return Normal; } + +"."(PHONY|PRECIOUS|SUFFIXES)/":"? { + return Keyword; +} + +^{ident}/[[:blank:]]*{assign} { + return Identifier; +} + +{assign} { + BEGIN(pop = Assign); + return Operator; +} +{ + "\n" { + BEGIN(pop = INITIAL); + return Normal; + } + [^$[:space:]]+ { return String; } +} + +{target}([[:blank:]]+{target})*/":" { + return IdentifierTag; +} + +^"-"?include { return Macro; } + +"#".* { return Comment; } + +<*>{ + "$"("{"|"(") { + depth++; + BEGIN(Interp); + return Interpolation; + } + "$". { return Interpolation; } +} +{ + "}"|")" { + if (!--depth) BEGIN(pop); + return Interpolation; + } + [^${}()]+ { return Interpolation; } +} + +.|\n { return Normal; } + +%{ + (void)yyunput; + (void)input; +%} + +%% + +const struct Lexer LexMake = { yylex, &yyin, &yytext }; -- cgit 1.4.1