У меня возникли проблемы с вычислением, принятием решения о том, как абстрактное синтаксическое дерево приведет к памяти, будет ли это лес деревьев для каждого оператора? Или это будет бинарное дерево с одним корнем?.
Источник образца:
P: 10
if A < 15:
P: 9
Вот BNF-грамматика:
<Prog> ::= <Stmts>
<Stmts> ::= <Stmt> | <Stmt> <Stmt>
<Stmt> ::= <IfStmt> NL | <AssignStmt> NL
<AssignStmt> ::= <Id> : <Aexp> | <Indents> <AssignStmt>
<IfStmt> ::= if <Lexp> : NL <Stmts> | <Indents> <IfStmt>
<Aexp> ::= <Id> | <Int> | <Aexp> <AOP> <Aexp>
<Lexp> ::= <Aexp> <LOP> <Aexp>
<LOP> ::= < | > | &
<AOP> ::= + | - | * | /
<Int> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <Int> <Int>
<Id> ::= A | B | C | D | E | F | P
<Indents> ::= SPC | SPC <Indents>
Где SPC
представляет пробел, а NL
символ новой строки. Да, он позволяет использовать только 7 идентификаторов. И положительные целые числа.
Его легко лексировать, однако я много искал, но большинство примеров AST используют только математические выражения, которые довольно легко понять. Если вы обнаружите, что моя грамматика неверна, скажите об этом. Также обратите внимание, что синтаксис вдохновлен Python. Я прочитал для него документ Lexical Analysis. но в нем даже не упоминается слово дерево.
Заранее спасибо.