演算子とブール演算をサポートする Google のような検索クエリを処理できる Jison を使用してパーサーを作成しました。現在、AND OR 演算子と NOT 演算子の間に空白を受け入れる方法がわかりません。任意の助けをいただければ幸いです。以下に、必要な入力/出力の例をいくつか添付しました。
入力:
- 真 && 偽 || 真実
- ( true ) && ( false || true )
- 真&&偽||真
結果:
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; }
;