如何在 jison/bison 中定义变量
How to define variable in jison/bison
我需要将数据存储在我的 jison 变量中,然后检索存储的值并执行简单的算术运算。我试过条件运算和表达式工作正常,但在我添加变量规则后出现错误。
我的输入是:
myvar1=3 myvar2=4 then myvar1+myvar2
我收到这个错误:
Parse error on line 1:
myvar=4
-----^
Expecting '=', 'EOF', '+', '-', '*', '/', '^', '<', '>', '==', '!=', '=<', '>=', got 'INVALID'
这是我的jison代码:
/* description: Parses end executes mathematical expressions. */
/* lexical grammar */
%{
var sym={};
%}
%lex
%%
\s+ /* skip whitespace */
[0-9]+("."[0-9]+)?\b return 'NUMBER'
[a-zA-Z]+\b return 'VARIABLE'
"*" return '*'
"/" return '/'
"-" return '-'
"+" return '+'
"^" return '^'
"(" return '('
")" return ')'
"PI" return 'PI'
"E" return 'E'
"<" return "<"
"=<" return "=<"
">=" return ">="
">" return ">"
"==" return "=="
"!=" return "!="
"IF" return "IF"
"THEN" return "THEN"
"ELSE" return "ELSE"
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
/* operator associations and precedence */
%left '<' '>' '==' '!=' '>=' '=<' '&&'
%left '+' '-'
%left '*' '/'
%left '^'
%left UMINUS
%start statement
%% /* language grammar */
statement
: expressions
| VARIABLE '=' expressions{ sym[]=}
;
expressions
: e EOF
{return ;}
;
e
:VARIABLE
{ $$=sym[]=}
| e '+' e
{$$ = +;}
| e '-' e
{
$$ =function(){
return -;
}(,)}
| e '*' e
{$$ = *;}
| e '/' e
{$$ = /;}
| e '^' e
{$$ = Math.pow(, );}
| '-' e %prec UMINUS
{$$ = -;}
| '(' e ')'
{$$ = ;}
| NUMBER
{$$ = Number(yytext);}
| E
{$$ = Math.E;}
| PI
{$$ = Math.PI;}
| e '<' e
{
$$=function(){
return <?true:false;
}(,)
}
| e '>' e
{
$$=function(){
return >?true:false;
}(,)
}
| e '==' e
{
$$=function(){
return ==?true:false;
}(,)
}
| e '!=' e
{
$$=function(){
return !=?true:false;
}(,)
}
| e '=<' e
{
$$=function(){
return ==?true:false;
}(,)
}
| e '>=' e
{
$$=function(){
return >=?true:false;
}(,)
}
|'IF''('e')''THEN''('e')''ELSE''('e')'
{
$$= ?:;
}
;
你的词法分析器永远不会产生任何 =
标记。如果您查看令牌规则列表,唯一匹配单个 =
的规则是 .
,它会生成一个 INVALID
令牌。
因此,由于规则 VARIABLE '=' expressions
需要一个 =
标记,因此匹配失败并且您会收到语法错误,告诉您(除其他事项外)应该是 =
.
一旦你解决了这个问题,另一个问题就是你的 expressions
规则(它似乎被错误命名,因为它似乎只匹配一个表达式)期望在最后有一个 EOF
,因此您的输入文件必须在第一次分配后结束。事实上,无论如何都不会支持多个赋值,因为您只会匹配一个语句。因此,要解决此问题,您应该从 expressions
规则中删除 EOF
,而是添加一个匹配多个语句的规则,后跟文件结尾(如果您根本不需要 EOF 令牌)和然后将该规则设为您的起始规则。
我需要将数据存储在我的 jison 变量中,然后检索存储的值并执行简单的算术运算。我试过条件运算和表达式工作正常,但在我添加变量规则后出现错误。
我的输入是:
myvar1=3 myvar2=4 then myvar1+myvar2
我收到这个错误:
Parse error on line 1:
myvar=4
-----^
Expecting '=', 'EOF', '+', '-', '*', '/', '^', '<', '>', '==', '!=', '=<', '>=', got 'INVALID'
这是我的jison代码:
/* description: Parses end executes mathematical expressions. */
/* lexical grammar */
%{
var sym={};
%}
%lex
%%
\s+ /* skip whitespace */
[0-9]+("."[0-9]+)?\b return 'NUMBER'
[a-zA-Z]+\b return 'VARIABLE'
"*" return '*'
"/" return '/'
"-" return '-'
"+" return '+'
"^" return '^'
"(" return '('
")" return ')'
"PI" return 'PI'
"E" return 'E'
"<" return "<"
"=<" return "=<"
">=" return ">="
">" return ">"
"==" return "=="
"!=" return "!="
"IF" return "IF"
"THEN" return "THEN"
"ELSE" return "ELSE"
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
/* operator associations and precedence */
%left '<' '>' '==' '!=' '>=' '=<' '&&'
%left '+' '-'
%left '*' '/'
%left '^'
%left UMINUS
%start statement
%% /* language grammar */
statement
: expressions
| VARIABLE '=' expressions{ sym[]=}
;
expressions
: e EOF
{return ;}
;
e
:VARIABLE
{ $$=sym[]=}
| e '+' e
{$$ = +;}
| e '-' e
{
$$ =function(){
return -;
}(,)}
| e '*' e
{$$ = *;}
| e '/' e
{$$ = /;}
| e '^' e
{$$ = Math.pow(, );}
| '-' e %prec UMINUS
{$$ = -;}
| '(' e ')'
{$$ = ;}
| NUMBER
{$$ = Number(yytext);}
| E
{$$ = Math.E;}
| PI
{$$ = Math.PI;}
| e '<' e
{
$$=function(){
return <?true:false;
}(,)
}
| e '>' e
{
$$=function(){
return >?true:false;
}(,)
}
| e '==' e
{
$$=function(){
return ==?true:false;
}(,)
}
| e '!=' e
{
$$=function(){
return !=?true:false;
}(,)
}
| e '=<' e
{
$$=function(){
return ==?true:false;
}(,)
}
| e '>=' e
{
$$=function(){
return >=?true:false;
}(,)
}
|'IF''('e')''THEN''('e')''ELSE''('e')'
{
$$= ?:;
}
;
你的词法分析器永远不会产生任何 =
标记。如果您查看令牌规则列表,唯一匹配单个 =
的规则是 .
,它会生成一个 INVALID
令牌。
因此,由于规则 VARIABLE '=' expressions
需要一个 =
标记,因此匹配失败并且您会收到语法错误,告诉您(除其他事项外)应该是 =
.
一旦你解决了这个问题,另一个问题就是你的 expressions
规则(它似乎被错误命名,因为它似乎只匹配一个表达式)期望在最后有一个 EOF
,因此您的输入文件必须在第一次分配后结束。事实上,无论如何都不会支持多个赋值,因为您只会匹配一个语句。因此,要解决此问题,您应该从 expressions
规则中删除 EOF
,而是添加一个匹配多个语句的规则,后跟文件结尾(如果您根本不需要 EOF 令牌)和然后将该规则设为您的起始规则。