- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在重做我最初在 Perl 上构建的迷你语言(请参阅 Chessa# on github ),但在应用语义时遇到了很多问题。
(* 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/
看标题。对于我正在编写的一个小工具,我想引入一种简单的 bool 过滤器语言,并决定“正确地”这样做并使用解析器生成器。在与 grako 玩了一会儿之后,我发现我喜欢它并且相当快地完成了过滤器语言(这
我的同事 PaulS 问了我以下问题: 我正在为现有语言(SystemVerilog - IEEE 标准)编写一个解析器,并且该规范中有一条结构与此类似的规则: cover_point =
我正在重做我最初在 Perl 上构建的迷你语言(请参阅 Chessa# on github ),但在应用语义时遇到了很多问题。 Here is the grammar : (* integers *)
我正在尝试通过 Grako 生成的语法来分析一些文档,该语法应该解析简单的句子以进行进一步分析,但在使用一些特殊标记时面临一些困难。 (Grako 风格)EBNF 看起来像: abbr::str =
我试图了解如何重新创建由 grako 生成的解析器解析的文档. 在深入研究 grako 源代码之后,我相信我终于理解了如何从 AST 返回到生成的文档。有人可以检查我的以下理解是否正确,让我知道是否有
在 search_query.ebnf 中,我对 grako 3.14.0 有以下语法定义: @@grammar :: SearchQuery start = search_query $; sear
我是一名优秀的程序员,十分优秀!