我使用 Jison 编写了一个解析器,它能够处理带有运算符和布尔运算支持的类似 google 的搜索查询。目前,我很难弄清楚如何在 AND OR 和 NOT 运算符之间接受空格。任何帮助将不胜感激,我在下面附上了一些所需输入/输出的示例。
输入:
- 真 && 假 || 真的
- ( 真 ) && ( 假 || 真 )
- 真&&假||真
结果:
1-3。([真]&&([假]||[真]))
代码:
%lex
%%
/* Lexical Grammar */
"AND"|"&&" { return "AND" }
"OR"|"||" { return "OR" }
"NOT"|"!" { return "NOT" }
"(" { return "OPEN" }
")" { return "CLOSE" }
":" { return "QUAL" }
"-" { return "DASH" }
"\""|"'" { return "QUOTE" }
\s+ { return "SPACE" }
\w+ { return "WORD" }
"." { return "DOT" }
<<EOF>> { return "EOF" }
. { return "INVALID" }
/lex
/* Operators */
%right AND OR
%right NOT
%right QUAL DASH DOT
%start START
%%
/* Language Grammar */
START
: EXP EOF
{ return $1; }
;
EXP
: EXP AND EXP
{ $$ = "(" + $1 + "&&" + $3 + ")"; }
| EXP OR EXP
{ $$ = "(" + $1 + "||" + $3 + ")"; }
| NOT EXP
{ $$ = "(!" + $2 + ")"; }
| OPEN EXP CLOSE
{ $$ = $2; }
| ARGS
{ $$ = "[" + $1 + "]"; }
;
ARGS
: ARG SPACE ARGS
{ $$ = [ $1 ].concat($3); }
| OP SPACE ARGS
{ $$ = [ $1 ].concat($3); }
| ARG
{ $$ = [ $1 ]; }
| OP
{ $$ = [ $1 ]; }
;
OP
: DASH OP
{ $$ = "-" + $2; }
| ARG QUAL ARG
{ $$ = $1 + ":" + $3; }
;
ARG
: DASH ARG
{ $$ = "-" + $2; }
| QUOTE TERMS QUOTE
{ $$ = $2.join(" "); }
| TERM
{ $$ = $1; }
;
TERMS
: TERM SPACE TERMS
{ $$ = [ $1 ].concat($3); }
| TERM
{ $$ = [ $1 ]; }
;
TERM
: TERM DASH TERM
{ $$ = $1 + $2 + $3; }
| TERM DOT TERM
{ $$ = $1 + $2 + $3; }
| WORD
{ $$ = $1; }
;