[我从一个使用%
(和单词mod
)作为模数运算符的语法开始了一个项目,现在我想将%
作为尾随的一元运算符加除以100。
[一些说明,我不使用基于C的语言,我已经使用bison的XML输出实现了自己的令牌生成器/编译器。我选择的步骤对我的实施至关重要。
有没有一种方法可以使我的语法在LALR(1)编译器中进行编译而没有任何移位/减少错误?
基本上以下语句都是有效的:
5%
-> 0.055%%5
-> 0.05 mod 55%%%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
说明符,但没有运气。
如果您愿意接受解析器复杂性的增加,则始终可以通过添加%glr-parser
指令将其转换为GLR解析器。这将意味着解析器将在到达冲突点时拆分并探索这两种状态,然后一旦处理了足够的令牌,它将删除任何无法解析的状态。不过,这确实需要足够新版本的野牛。但是,像其他人建议的那样,重新设计语言可能更好。考虑到Bison对GLR解析器的现有限制,使用GLR解析器将意味着您可能最终会使用连续百分比的指数数量的内存。