如何在 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 令牌)和然后将该规则设为您的起始规则。