我正在尝试将我们创建的假设语言的语法简化为 LL(1)。我使用引入新的非终结符的一般规则,删除了语法中的大部分左分解问题。
例如,
<assignmentstats>------- <type><id>=<E>/ id=<E>/id'['<E>']'=<E>/
被转化为
<assignmentstats>------- <type><id>=<E>/ id<LF3>
<LF3>------- =<E>/[<E>]=<E>
在对所有必需的语句应用这些规则之后,我期望得到一个明确的语法。
但是下面的陈述不知何故仍然模棱两可。
<body>------- <forrelatedstuff>/ <floors>/<stats>
下面是语法的相关说明(只显示了需要的)
<funcbody>----- {<stats>}
<stats>----- <stat> <stats>/ #
<floors>-------- <floor><floors>/ #
<floor>------- floo <id><arr>{stats}/id<arr>{<stats>}
<stat>----- <superstats>/<returnstats>
<superstats>----- <type>id<Zip>/id<LF3>
<building> ------- build <id> {<body>}
<returnstats>--------- return <E>
我对其进行了更多研究,发现歧义在“楼层”和“统计”之间。FIRST('stats') 和 FIRST('floors'),即第一个终端字符的集合都包含“id”和“}”。
我可以看到为什么这会是一个问题,以及左分解如何解决这个问题。但是我怎样才能通过左分解来消除这种歧义呢?
注意:这里,'id' 表示标识符。
'#' 表示 epsilon。