首页 > 解决方案 > 如何使用 mpc 解析器定义标准数学符号

问题描述

我在这里www.buildyourownlisp.com阅读编译器教程。它使用称为 mpc 的解析器组合器。我目前所拥有的将解析波兰符号,但我正在尝试研究如何使用标准符号。我只是不知道该怎么做。解析器的规则如下:

.   Any character is required.
a   The character a is required.
[abcdef]    Any character in the set abcdef is required.
[a-f]   Any character in the range a to f is required.
a?  The character a is optional.
a*  Zero or more of the character a are required.
a+  One or more of the character a are required.
^   The start of input is required.
$   The end of input is required.
"ab"    The string ab is required.
'a' The character a is required.
'a' 'b' First 'a' is required, then 'b' is required.
'a' | 'b'   Either 'a' is required, or 'b' is required.
'a'*    Zero or more 'a' are required.
'a'+    One or more 'a' are required.
<abba>  The rule called abba is required.

波兰符号是这样写的:

     "                                                                                       \
number:    /-?[0-9]+/'.'?/[0-9]+/ ;                                                \
operator:  '+' | '-' | '*' | '/' | '%' | \"add\" | \"sub\" | \"mul\" | \"div\" ;           \
expr:      <number> | '(' <operator> <expr>+ ')' ;                                            \
dlispy:    /^/ <operator> <expr>+ /$/ ;",

我已经设法通过添加来使其接受十进制数字'.'?/[0-9]+/,但我无法弄清楚如何对其进行重组以接受标准符号,例如2*(3+2)而不是*2 (+ 3 2). 我知道我必须重写 expr 和 dlispy 规则,但我对正则表达式和 BNF 不熟悉。希望能帮到你,谢谢

标签: cregexparsingebnfmpc

解决方案


写成 yacc 规则,那就是:

expr    : '(' expr ')
        | expr operator expr
        | number
        ;

推荐阅读