我最近为这个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)解析器吗?
附录:令牌为NAME
,STRING
,DATA
,>
,<
,/>
,</
和=
。
更新11/3/16:
显然,没有必要进行转型。语法已经在LR(1)中,经过更多的研究后我能够证实它。我现在已经完成了两个解析器的实现,我感谢所有能够提供帮助的人!