EBNF как этотКаков правильный способ преобразования EBNF в BNF при использовании парсера GLR?
Goal = Stmt
Stmt = "if" "expr" "then" Stmt ("else" Stmt)?
Stmt = "S"
Должен ли я конвертировать это
Goal = Stmt
X = "else" Stmt
Stmt = "if" "expr" "then" Stmt | "if" "expr" "then" Stmt X
Stmt = "S"
Или
Goal = Stmt
Stmt = "if" "expr" "then" Stmt | "if" "expr" "then" Stmt "else" Stmt
Stmt = "S"
Являются ли эти два BNF означают то же самое, чтобы РВО парсер?
------------------------ СОДЕРЖАНИЕ APPEND -------------------- ----------
Если lexes являются
"if" "expr" "then" "if" "expr" "then" "S" "else" "S"
РВО анализатор должен получить два дерева
Goal
Stmt
"if"
"expr"
"then"
Stmt
"if"
"expr"
"then"
Stmt
"S"
"else"
Stmt
"S"
И
Goal
Stmt
"if"
"expr"
"then"
Stmt
"if"
"expr"
"then"
Stmt
"S"
"else"
Stmt
"S"
Но первый преобразованный BNF может получить только первое дерево, потому что, когда он встречается с, конфликта нет в сокращении/смене, конфликт наступает на X.
Второй BNF будет иметь конфликт с уменьшением/он соответствует "else"
, поэтому синтаксический анализатор разбивается на два потока для разбора в разных условиях.
Я прав? Есть ли какой-нибудь ACTION, генератор GOTO TABLE, который будет обрабатывать первый BNF так же, как второй?
проблема решена, первый преобразованный BNF может генерировать второе дерево. Только если вы создадите правую таблицу Action. – qdwang