Помогите с этой грамматикой XMl in Bison - PullRequest
0 голосов
/ 26 ноября 2010

У меня есть следующая грамматика, и я не знаю, как это исправить.Я проверяю, если это неоднозначно с условиями Вирта, но, возможно, это не имеет значения, потому что бизоны используют парсер LR:

Первая версия, 7 сдвигов / уменьшений

S->DE
D->aKc
E-><J K E2
E2-> /> | > H I
I-> </J>
K-> | KL
L-> j ='N'
H-> | HT
T-> N E3
E3-> | E N
N -> | N N2
N2-> text | j

где j - допустимое слово, а текст - просто текст без какого-либо специального символа, a и c - строка, окружающая объявление xml.один из возникающих конфликтов - это сдвиг / уменьшение, которые приводят к тому, что правило E3 -> / пусто / становится бесполезным.

Я делаю некоторые улучшения с переходом epsilon

Вторая версия 2shift / уменьшение

S-> D E
D-> a D2
D2->|K c
E-> <J E1
E1-> E2 | K E2
E2-> /> | > HI
I-> </J>
K-> L | K L
L-> J= 'N'
N-> N N2 | N2
N2-> X | J
H-> HT | T
T-> N|E

проблема уменьшения на 2 смены заключается в том, что после чтенияX или J, и приходит другой X или J, он не знает, уменьшит ли он T или сдвиг и подготовится ли использовать N-> N N2 |N2

Третья версия 2, сдвиг / уменьшение, но хорошо распознавать мои образцы XML-файлов

S-> D E
D-> a D2
D2-> K c | c     // a is "<?xml version=\"1.0\"" and c is "?>"
E-> <J E1
E1-> E2 | K E2
E2-> /> | > E3   // this is the other correction, for the case of an empty element
E3-> HI | I
I-> </J>
K-> L | K L
L-> J= 'N'
N-> N N2 | N2
N2-> X | J    // X and J are word(any strange word) and ValidWord(used in element and atributes names)
H-> HT | T
T-> N|E

1 Ответ

1 голос
/ 26 ноября 2010

Это настолько загадочно, насколько это возможно, и я полагаю, вы получаете много конфликтов.

Левая рекурсия в пункте N -> |N N2 предлагает бесконечный цикл, в котором 2-е N постоянно уменьшается до пустого с использованием 1-го правила.

Если E3-> пустой и N-> пустой, то T-> пустой и если H-> пустой в его первомИз этого следует, что H-> пусто, потому что HT-> пусто.И так далее.

Я бы начал с чего-то более простого, чтобы лучше понять написание парсера.

...