LALR(1)移位/减少错误,对于百分比和mod均使用%

问题描述 投票:0回答:1

[我从一个使用%(和单词mod)作为模数运算符的语法开始了一个项目,现在我想将%作为尾随的一元运算符加除以100。

[一些说明,我不使用基于C的语言,我已经使用bison的XML输出实现了自己的令牌生成器/编译器。我选择的步骤对我的实施至关重要。

有没有一种方法可以使我的语法在LALR(1)编译器中进行编译而没有任何移位/减少错误?

基本上以下语句都是有效的:

  • 5%-> 0.05
  • 5%%5-> 0.05 mod 5
  • 5%%%5-> 0.0005 mod 5等

我只是不知道如何将其表达为我的语法:

%token S_NUM

%%

default: mod_term ;

mod_term: _mod_value
    | percent_term ;

_mod_value: mod_term O_PERCENT percent_term ;

percent_term: _percent_value
    | value ;

_percent_value: value O_PERCENT ;

value: S_NUM ;

%%

我还使用以下语句对其进行编译:bison -v --report=all --warnings=no-other -Werror=conflicts-sr --xml test.y -o test.y.xml

((由于环境原因,我将移位/减少为错误)

有什么想法吗?我玩过%left%right说明符,但没有运气。

bison lalr shift-reduce-conflict
1个回答
0
投票

如果您愿意接受解析器复杂性的增加,则始终可以通过添加%glr-parser指令将其转换为GLR解析器。这将意味着解析器将在到达冲突点时拆分并探索这两种状态,然后一旦处理了足够的令牌,它将删除任何无法解析的状态。不过,这确实需要足够新版本的野牛。但是,像其他人建议的那样,重新设计语言可能更好。考虑到Bison对GLR解析器的现有限制,使用GLR解析器将意味着您可能最终会使用连续百分比的指数数量的内存。

© www.soinside.com 2019 - 2024. All rights reserved.