Позвольте мне сначала задать вопрос: могу ли я преобразовать дерево разбора, реализующее эту конкретную грамматику в AST тривиально.Преобразование дерева разбора в AST
Я получил эту грамматику, чтобы построить дерево разбора:
literal := INTEGER | FLOAT | TRUE | FALSE .
designator := IDENTIFIER { "[" expression0 "]" } .
op0 := ">=" | "<=" | "!=" | "==" | ">" | "<" .
op1 := "+" | "-" | "or" .
op2 := "*" | "/" | "and" .
expression0 := expression1 [ op0 expression1 ] .
expression1 := expression2 { op1 expression2 } .
expression2 := expression3 { op2 expression3 } .
expression3 := "not" expression3
| "(" expression0 ")"
| designator
| call-expression
| literal .
Для этого конкретного примера:
func main() : void {
let a = 1 + 2 + 3 + 4;
}
Мой анализатор будет генерировать (часть) дерево разбора как таковой
EXPRESSION1
EXPRESSION2
EXPRESSION3
LITERAL
INTEGER(1)(lineNum:2, charPos:10)
OP1
ADD(lineNum:2, charPos:12)
EXPRESSION2
EXPRESSION3
LITERAL
INTEGER(2)(lineNum:2, charPos:14)
OP1
ADD(lineNum:2, charPos:16)
EXPRESSION2
EXPRESSION3
LITERAL
INTEGER(3)(lineNum:2, charPos:18)
OP1
ADD(lineNum:2, charPos:20)
EXPRESSION2
EXPRESSION3
LITERAL
INTEGER(4)(lineNum:2, charPos:22)
Просто обратите внимание, как эти ветви деревьев под EXPRESSION1 идут:
EXPRESSION2 + EXPRESSION2 + EXPRESSION2 + EXPRESSION2
который оператор + не соответствует его двум операндам. Так что мне кажется, что в преобразовании АСТ я не могу получить AST, который помогает генерировать 3-адресный IR-код, просто подтягивая оператора для замены нетерминального EXPRESSION1.
Для достижения этой цели, грамматика я бы написал для этого языка будет как этот вместо
expression1 := expression2 | expression1 + expression2 (1)
expression2 := expression3 | expression2 * expression3 (2)
expression3 := literal (3)
, которые ветвь под ВЫРАЖЕНИЕ1 только
EXPRESSION1 + EXPRESSION2
Однако эта грамматика не LL (1), так как | FIRST (выражение2) | = | {literal, +} | > 1.
Он задает вопрос, что (1) что было бы самым элегантным и тривиальным способом преобразования этого дерева разбора? (2) является ли мое построение дерева разбора полной потерей времени для этой грамматики, что я должен был начать кодирование АСТ вместо этого?
Вы можете рассмотреть реальные различия между деревом синтаксического анализа и абстрактным деревом синтаксиса. См. Мой ответ: http://stackoverflow.com/questions/1888854/what-is-the-difference-between-an-abstract-syntax-tree-and-a-concrete-syntax-tre/1916687#1916687 –
Это похоже очень хорошо. Я слышал некоторые приятные свойства о GLR. Теперь для сжатия используется сжатый CST. Спасибо за информацию. – Davis
Ну, это какое-то школьное задание, которое я не смог выяснить до крайнего срока.Мне нужно следовать конкретному руководству. Я был слишком глуп, чтобы не осознавать, что проблема с грамматикой выражения заключается в том, что цель АСТ была не просто «упрощенной» версией КНТ. Древовидная структура отличается. Я просто немного разозлился. – Davis