gpt4 book ai didi

python - grako 的规则优先级问题

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:32 25 4
gpt4 key购买 nike

我正在重做我最初在 Perl 上构建的迷你语言(请参阅 Chessa# on github ),但在应用语义时遇到了很多问题。

Here is the grammar :

(* integers *)
DEC = /([1-9][0-9]*|0+)/;
int = /(0b[01]+|0o[0-7]+|0x[0-9a-fA-F]+)/ | DEC;
(* floats *)
pointfloat = /([0-9]*\.[0-9]+|[0-9]+\.)/;
expfloat = /([0-9]+\.?|[0-9]*\.)[eE][+-]?[0-9]+/;
float = pointfloat | expfloat;
list = '[' @+:atom {',' @+:atom}* ']';
(* atoms *)
identifier = /[_a-zA-Z][_a-zA-Z0-9]*/;
symbol = int |
float |
identifier |
list;
(* functions *)
arglist = @+:atom {',' @+:atom}*;
function = identifier '(' [arglist] ')';
atom = function | symbol;
prec8 = '(' atom ')' | atom;
prec7 = [('+' | '-' | '~')] prec8;
prec6 = prec7 ['!'];
prec5 = [prec6 '**'] prec6;
prec4 = [prec5 ('*' | '/' | '%' | 'd')] prec5;
prec3 = [prec4 ('+' | '-')] prec4;
(* <| and >| are rotate-left and rotate-right, respectively. They assume the nearest C size. *)
prec2 = [prec3 ('<<' | '>>' | '<|' | '>|')] prec3;
prec1 = [prec2 ('&' | '|' | '^')] prec2;
expr = prec1 $;

我遇到的问题是,当运算符和任何后续字母数字字符串之间不存在空格时,d 运算符被拉入标识符规则。虽然语法本身是 LL(2),但我不明白问题出在哪里。

例如,4d6 停止解析器,因为它被解释为 4 d6,其中 d6 是一个标识符。应该发生的是它被解释为 4 d 6,其中 d 是一个运算符。在 LL 解析器中,情况确实如此。

一个可能的解决方案是禁止 d 作为标识符的开头,但这将禁止像 drop 这样的函数被命名。

最佳答案

在 Perl 中,您可以使用 Marpa ,一个通用的 BNF 解析器,它支持具有开箱即用的关联性(以及更多)的广义优先级,例如

:start ::= Script
Script ::= Expression+ separator => comma
comma ~ [,]
Expression ::=
Number bless => primary
| '(' Expression ')' bless => paren assoc => group
|| Expression '**' Expression bless => exponentiate assoc => right
|| Expression '*' Expression bless => multiply
| Expression '/' Expression bless => divide
|| Expression '+' Expression bless => add
| Expression '-' Expression bless => subtract

完整的工作示例是 here .至于编程语言,有一个 C parser based on Marpa .

希望这对您有所帮助。

关于python - grako 的规则优先级问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26016475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com