LL(1)至LR(1)转换

Fie*_*nix 7 xml grammar parsing 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 > 
Run Code Online (Sandbox Code Playgroud)

我已经从这个简单的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
Run Code Online (Sandbox Code Playgroud)

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

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

附录:令牌是NAME,STRING,DATA,>,<,/>,</,和=.

2016年11月3日更新:

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