Как определить стандартную математическую нотацию с парсером mpc - PullRequest
0 голосов
/ 24 октября 2018

Я читаю здесь учебник по компилятору 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, но я новичок в regex и BNF.Надеюсь, вы можете помочь, спасибо

1 Ответ

0 голосов
/ 24 октября 2018

Написано как правила yacc, это будет:

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