parsing - 消除 Bison 中的歧义

标签 parsing bison context-free-grammar flex-lexer ambiguity

我正在用 bison 编写一个简单的解析器。解析器检查程序是否存在与我的以下语法相关的任何语法错误:

%{
#include <stdio.h>
void yyerror (const char *s) /* Called by yyparse on error */
{
    printf ("%s\n", s);
}
%}
%token tNUM tINT tREAL tIDENT tINTTYPE tREALTYPE tINTMATRIXTYPE 
%token tREALMATRIXTYPE tINTVECTORTYPE tREALVECTORTYPE tTRANSPOSE
%token tIF tENDIF tDOTPROD tEQ tNE tGTE tLTE tGT tLT tOR tAND
%left "(" ")" "[" "]"
%left "<" "<=" ">" ">="
%right "="
%left "+" "-"
%left "*" "/"
%left "||"
%left "&&"
%left "==" "!="

%% /* Grammar rules and actions follow */
prog: stmtlst ;
stmtlst: stmt | stmt stmtlst ;
stmt: decl | asgn | if;
decl: type vars "=" expr ";" ;
type: tINTTYPE | tINTVECTORTYPE  | tINTMATRIXTYPE | tREALTYPE | tREALVECTORTYPE 
      | tREALMATRIXTYPE ;
vars: tIDENT | tIDENT "," vars ;
asgn: tIDENT "=" expr ";" ;
if: tIF "(" bool ")" stmtlst tENDIF ;
expr: tIDENT | tINT | tREAL | vectorLit | matrixLit | expr "+" expr| expr "-" expr
  | expr "*" expr | expr "/" expr| expr tDOTPROD expr | transpose ;
transpose: tTRANSPOSE "(" expr ")" ;
vectorLit: "[" row "]" ;
matrixLit: "[" row ";" rows "]" ;
row: value | value "," row ;
rows: row  | row ";" rows ; 
value: tINT | tREAL | tIDENT ;
bool: comp | bool tAND bool | bool tOR bool ;
comp: expr relation expr ;
relation: tGT | tLT | tGTE | tLTE | tNE | tEQ ;
%%
int main ()
{    
    if (yyparse()) {
        // parse error
        printf("ERROR\n");
        return 1;
    }
    else {
        // successful parsing
        printf("OK\n");
        return 0;
    }
}

代码可能看起来又长又复杂,但我认为我要问的不需要完整的代码,但无论如何我更喜欢编写代码。我确信我的语法是正确的,但含糊不清。当我尝试通过编写“bison -d filename.y”来创建程序的可执行文件时,我收到一条错误消息,指出冲突:13 shift/reduce。我在该文件的开头定义了运算符的优先级,并且尝试了这些优先级的很多组合,但仍然收到此错误。我怎样才能消除这种歧义?谢谢

最佳答案

tORtANDtDOTPROD 还需要指定其优先级。

关于parsing - 消除 Bison 中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15328720/

相关文章:

python - python 样式结构的 BNF 语法

python - 将 Bash 解析为 Python

使用 bison 生成的文件进行循环依赖解析

bison - -y/-yacc 标志在 bison 中起什么作用?

c++ - 编译我的 flex 和 bison 代码时,G++ 无法识别我的 C++ 类

grammar - 歧义语法

compiler-construction - GLR 中的歧义非终结符

Python:将耗时(分:秒)解析为秒

java - 在java中加载和解析csv

regex - 在带有括号的一维列表上应用递归