/
MakefileLexer.flex
121 lines (103 loc) · 3.68 KB
/
MakefileLexer.flex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.jetbrains.lang.makefile;
import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;
import com.jetbrains.lang.makefile.psi.MakefileTypes;
import static com.intellij.psi.TokenType.BAD_CHARACTER;
import static com.intellij.psi.TokenType.WHITE_SPACE;
import static com.jetbrains.lang.makefile.psi.MakefileTypes.*;
%%
%{
public _MakefileLexer() {
this((java.io.Reader)null);
}
%}
%public
%class _MakefileLexer
%implements FlexLexer
%function advance
%type IElementType
%unicode
EOL=\n
SPACES=" "+
BACKSLASHCRLF="\\"(\n)(" "|\t)*
DOCCOMMENT="##"[^\n]*
COMMENT="#"[^\n]*
MULTILINECOMMENT="#"[^\n\\]*(("\\"\n[^\n\\]*|"\\"[^\n\\]*))+
FUNCTIONS=("error"|"warning"|"info"|"shell"|"subst"|"patsubst"|"strip"|"findstring"|
"filter"|"filter-out"|"sort"|"word"|"wordlist"|"words"|"firstword"|"lastword"|"dir"|"notdir"|"suffix"|
"basename"|"addsuffix"|"addprefix"|"join"|"wildcard"|"realpath"|"abspath"|"if"|"or"|"and"|
"foreach"|"file"|"call"|"value"|"eval"|"origin"|"flavor"|"guile")
MACRO="@"[^@ \n]+"@"
ASSIGN=("="|":="|"::="|"?="|"!="|"+=")
CHARS = [0-9\p{L}.!\-?%@/_\[\]+~*\^&+<>]
%state SQSTRING DQSTRING DEFINE
%%
<SQSTRING> {
"'" { yybegin(YYINITIAL); return QUOTE; }
"\"" { return CHARS; }
"#"+ { return CHARS; }
{EOL} { yybegin(YYINITIAL); return EOL; }
}
<DQSTRING> {
"\"" { yybegin(YYINITIAL); return DOUBLEQUOTE; }
"'" { return CHARS; }
"#"+ { return CHARS; }
{EOL} { yybegin(YYINITIAL); return EOL; }
}
<DEFINE> {
"endef" { yybegin(YYINITIAL); return KEYWORD_ENDEF; }
{CHARS}+ { return CHARS; }
"\"" { return CHARS; }
"'" { return CHARS; }
"#"+ { return CHARS; }
}
\\"#" { return CHARS; }
<YYINITIAL> {
^[ ]*{COMMENT}\n { return COMMENT; }
{DOCCOMMENT} { return DOC_COMMENT; }
{MULTILINECOMMENT} { return COMMENT; }
{COMMENT} { return COMMENT; }
}
^{MACRO} { return MACRO; }
^\t+ { return TAB; }
\t+ { return WHITE_SPACE; }
{EOL} { return EOL; }
{SPACES} { return WHITE_SPACE; }
\\: { return CHARS; }
(\\\(|\\\)) { return CHARS; }
: { return COLON; }
"," { return COMMA; }
"`" { return BACKTICK; }
{ASSIGN} { return ASSIGN; }
{BACKSLASHCRLF} { return SPLIT; }
"|" { return PIPE; }
";" { return SEMICOLON; }
"include" { return KEYWORD_INCLUDE; }
"-include" { return KEYWORD_INCLUDE; }
"sinclude" { return KEYWORD_INCLUDE; }
"vpath" { return KEYWORD_VPATH; }
^"define" { yybegin(DEFINE); return KEYWORD_DEFINE; }
"undefine" { return KEYWORD_UNDEFINE; }
"ifeq" { return KEYWORD_IFEQ; }
"ifneq" { return KEYWORD_IFNEQ; }
"ifdef" { return KEYWORD_IFDEF; }
"ifndef" { return KEYWORD_IFNDEF; }
"else" { return KEYWORD_ELSE; }
"endif" { return KEYWORD_ENDIF; }
"override" { return KEYWORD_OVERRIDE; }
"export" { return KEYWORD_EXPORT; }
"unexport" { return KEYWORD_UNEXPORT; }
"private" { return KEYWORD_PRIVATE; }
"$" { return DOLLAR; }
{FUNCTIONS} { return FUNCTION_NAME; }
"(" { return OPEN_PAREN; }
")" { return CLOSE_PAREN; }
"{" { return OPEN_CURLY; }
"}" { return CLOSE_CURLY; }
\\\" { return ESCAPED_DOUBLEQUOTE; }
"'" { yybegin(SQSTRING); return QUOTE; }
"\"" { yybegin(DQSTRING); return DOUBLEQUOTE; }
{CHARS}+ { return CHARS; }
\\\\ { return CHARS; }
\\ { return CHARS; }
[^] { return BAD_CHARACTER; }