-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathAwk.flex
More file actions
149 lines (133 loc) · 7.15 KB
/
Copy pathAwk.flex
File metadata and controls
149 lines (133 loc) · 7.15 KB
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package intellij_awk;
import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;
import static com.intellij.psi.TokenType.BAD_CHARACTER;
import static com.intellij.psi.TokenType.WHITE_SPACE;
import static intellij_awk.psi.AwkTypes.*;
%%
%{
public AwkLexer() {
this((java.io.Reader)null);
}
%}
%public
%class AwkLexer
%implements FlexLexer
%function advance
%type IElementType
%unicode
EOL=\R
COMMENT=#.* | (\\\n)
BUILTIN_FUNC_NAME=atan2|cos|sin|exp|log|sqrt|int|rand|srand|gsub|index|length|match|split|sprintf|sub|substr|tolower|toupper|close|fflush|system
BUILTIN_FUNC_NAME_GAWK=asort|asorti|gensub|patsplit|strtonum|mktime|strftime|systime|and|compl|lshift|or|rshift|xor|isarray|typeof|bindtextdomain|dcgettext|dcngettext
NUMBER=( \d+ | (\d* \. \d+) | (\d+ \. \d*) ) ([eE] [+-]? \d+)?
STRING=([\"]([^\"\n\\]|\\.|\\\n)*[\"])
ERE="/"((\[\^?\/)|[^\\\n/]|(\\[^\n]))*"/"
TYPED_ERE=@{ERE}
NEWLINE=\r\n|\n
NS_PART=[a-zA-Z_]+[a-zA-Z_\d]*::
SPECIAL_VAR_NAME = {NS_PART}? (ARGC|ARGV|CONVFMT|ENVIRON|FILENAME|FNR|FS|NF|NR|OFMT|OFS|ORS|RLENGTH|RS|RSTART|SUBSEP)
SPECIAL_VAR_NAME_GAWK = {NS_PART}? (BINMODE|FIELDWIDTHS|FPAT|IGNORECASE|LINT|PREC|ROUNDMODE|TEXTDOMAIN|ARGIND|ERRNO|FUNCTAB|PROCINFO|RT|SYMTAB)
VAR_NAME = {NS_PART}? [a-zA-Z_]+[a-zA-Z_\d]*
//LIVEPREVIEWWS=[ \t]*(\\\n)*
WHITE_SPACE=[ \t]+
%state AFTER_BEGIN_END
%state AFTER_AT
%state DIV_POSSIBLE
%%
// In AWK the '{' should go on the same line with BEGIN/END
<AFTER_BEGIN_END> {
{WHITE_SPACE} { return WHITE_SPACE; }
"{" { yybegin(YYINITIAL); return LBRACE; }
}
<AFTER_AT> {
"namespace" { yybegin(YYINITIAL); return NAMESPACE; }
"include" { yybegin(YYINITIAL); return INCLUDE; }
"load" { yybegin(YYINITIAL); return LOAD; }
{VAR_NAME} /\( { yybegin(YYINITIAL); return VAR_NAME; }
}
<YYINITIAL, DIV_POSSIBLE, AFTER_AT> {
{WHITE_SPACE} { return WHITE_SPACE; }
"BEGINFILE" /\(? { yybegin(AFTER_BEGIN_END); return BEGINFILE; }
"ENDFILE" /\(? { yybegin(AFTER_BEGIN_END); return ENDFILE; }
"BEGIN" /\(? { yybegin(AFTER_BEGIN_END); return BEGIN; }
"END" /\(? { yybegin(AFTER_BEGIN_END); return END; }
"break" /\(? { yybegin(YYINITIAL); return BREAK; }
"continue" /\(? { yybegin(YYINITIAL); return CONTINUE; }
"delete" /\(? { yybegin(YYINITIAL); return DELETE; }
"do" /\(? { yybegin(YYINITIAL); return DO; }
"else" /\(? { yybegin(YYINITIAL); return ELSE; }
"exit" /\(? { yybegin(YYINITIAL); return EXIT; }
"for" /\(? { yybegin(YYINITIAL); return FOR; }
"function" /\(? { yybegin(YYINITIAL); return FUNCTION; }
"func" /\(? { yybegin(YYINITIAL); return FUNCTION; }
"if" /\(? { yybegin(YYINITIAL); return IF; }
"in" /\(? { yybegin(YYINITIAL); return IN; }
"nextfile" /\(? { yybegin(YYINITIAL); return NEXTFILE; }
"next" /\(? { yybegin(YYINITIAL); return NEXT; }
"print" /\(? { yybegin(YYINITIAL); return PRINT; }
"printf" /\(? { yybegin(YYINITIAL); return PRINTF; }
"return" /\(? { yybegin(YYINITIAL); return RETURN; }
"while" /\(? { yybegin(YYINITIAL); return WHILE; }
"switch" /\(? { yybegin(YYINITIAL); return SWITCH; }
"case" { yybegin(YYINITIAL); return CASE; }
"default" { yybegin(YYINITIAL); return DEFAULT; }
"getline" /\(? { yybegin(DIV_POSSIBLE); return GETLINE; }
"+=" { yybegin(YYINITIAL); return ADD_ASSIGN; }
"-=" { yybegin(YYINITIAL); return SUB_ASSIGN; }
"*=" { yybegin(YYINITIAL); return MUL_ASSIGN; }
"/=" { yybegin(YYINITIAL); return DIV_ASSIGN; }
"%=" { yybegin(YYINITIAL); return MOD_ASSIGN; }
"^=" { yybegin(YYINITIAL); return POW_ASSIGN; }
"||" { yybegin(YYINITIAL); return OR; }
"&&" { yybegin(YYINITIAL); return AND; }
"!~" { yybegin(YYINITIAL); return NO_MATCH; }
"==" { yybegin(YYINITIAL); return EQ; }
"<=" { yybegin(YYINITIAL); return LE; }
">=" { yybegin(YYINITIAL); return GE; }
"!=" { yybegin(YYINITIAL); return NE; }
"++" { yybegin(YYINITIAL); return INCR; }
"--" { yybegin(YYINITIAL); return DECR; }
">>" { yybegin(YYINITIAL); return APPEND; }
"$" { yybegin(YYINITIAL); return DOLLAR; }
"[" { yybegin(YYINITIAL); return LBRACKET; }
"]" { yybegin(DIV_POSSIBLE); return RBRACKET; }
"{" { yybegin(YYINITIAL); return LBRACE; }
"}" { yybegin(YYINITIAL); return RBRACE; }
"(" { yybegin(YYINITIAL); return LPAREN; }
")" { yybegin(DIV_POSSIBLE); return RPAREN; }
"," { yybegin(YYINITIAL); return COMMA; }
";" { yybegin(YYINITIAL); return SEMICOLON; }
"<" { yybegin(YYINITIAL); return LT; }
">" { yybegin(YYINITIAL); return GT; }
"+" { yybegin(YYINITIAL); return ADD; }
"-" { yybegin(YYINITIAL); return SUB; }
"*" { yybegin(YYINITIAL); return MUL; }
"/" { yybegin(YYINITIAL); return DIV; }
"%" { yybegin(YYINITIAL); return MOD; }
"^" { yybegin(YYINITIAL); return POW; }
"~" { yybegin(YYINITIAL); return MATCH; }
"|&" { yybegin(YYINITIAL); return PIPE_AMP; }
"|" { yybegin(YYINITIAL); return PIPE; }
"!" { yybegin(YYINITIAL); return NOT; }
"?" { yybegin(YYINITIAL); return QUESTION; }
":" { yybegin(YYINITIAL); return COLON; }
"=" { yybegin(YYINITIAL); return ASSIGN; }
"@" { yybegin(AFTER_AT); return AT; }
{COMMENT} { return COMMENT; }
{NUMBER} { yybegin(DIV_POSSIBLE); return NUMBER; }
{STRING} { yybegin(DIV_POSSIBLE); return STRING; }
{TYPED_ERE} { yybegin(YYINITIAL); return TYPED_ERE; }
{NEWLINE} { yybegin(YYINITIAL); return NEWLINE; }
{BUILTIN_FUNC_NAME} /\(? { yybegin(YYINITIAL); return BUILTIN_FUNC_NAME; }
{BUILTIN_FUNC_NAME_GAWK} /\(? { yybegin(YYINITIAL); return BUILTIN_FUNC_NAME_GAWK; }
{VAR_NAME} /\( { yybegin(YYINITIAL); return FUNC_NAME; }
{SPECIAL_VAR_NAME} { yybegin(DIV_POSSIBLE); return SPECIAL_VAR_NAME; }
{SPECIAL_VAR_NAME_GAWK} { yybegin(DIV_POSSIBLE); return SPECIAL_VAR_NAME_GAWK; }
{VAR_NAME} { yybegin(DIV_POSSIBLE); return VAR_NAME; }
// {LIVEPREVIEWWS} { return LIVEPREVIEWWS; }
}
<YYINITIAL> {
{ERE} { return ERE; }
}
[^] { return BAD_CHARACTER; }