LL(1)至LR(1)转换

时间:2016-10-24 20:37:54

标签: xml parsing grammar context-free-grammar

我最近为这个LL(1)语法编写了一个递归下降解析器(它生成了一小部分XML):

document ::= element EOF
element ::= < elementPrefix
elementPrefix ::= NAME attribute elementSuffix
attribute ::= NAME = STRING attribute
attribute ::= EPSILON
elementSuffix ::= > elementOrData endTag
elementSuffix ::= />
elementOrData ::= < elementPrefix elementOrData
elementOrData ::= DATA elementOrData
elementOrData ::= EPSILON
endTag ::= </ NAME > 

我已经从这个简单的EBNF语法中将语法转换为LL(1):

document  ::=  element
element   ::=  start_tag (element | DATA)* end_tag | empty_tag
start_tag ::=  < NAME attribute* >
end_tag   ::=  </ NAME >
empty_tag ::=  < NAME attribute* />
attribute ::=  NAME = STRING

现在,我正在编写一个识别相同语法的shift-reduce解析器。我意识到每个LL(1)语法也是LR(1)。但是,我的教授告诉我,为上述LL(1)语法编写一个shift-reduce解析器“可能不方便”。这使我认为在开始编译解析器之前我需要将其转换为LR(1)。

假设使用上面的LL(1)语法编写LR(1)解析器确实不是一个好主意,我怎样才能将它转换为LR(1)?什么会我需要改为实际上让它更适合手工编码的LR(1)解析器吗?

附录:令牌为NAMESTRINGDATA></></=

更新11/3/16:

显然,没有必要进行转型。语法已经在LR(1)中,经过更多的研究后我能够证实它。我现在已经完成了两个解析器的实现,我感谢所有能够提供帮助的人!

0 个答案:

没有答案