负责法+金LALR分析器,无法区分特殊的情况下NewLine从空白
-
11-09-2019 - |
题
- 我想要考虑的空格和内容的行为是正常的空格.
- 我要区分新行从其他空格而且允许特殊情况。
第一次尝试写一个符合法失败。
这里是语法:
! ------------------------------------------------- Sets
{WS} = {Whitespace} - {CR} - {LF}
{ID Head} = {Letter} + [_]
{ID Tail} = {Alphanumeric} + [_]
{String Chars} = {Printable} + {HT} - ["\]
! ------------------------------------------------- Terminals
! The following defines the Whitespace terminal using the {WS}
! set - which excludes the carriage return and line feed
! characters
Whitespace = {WS}+ | {CR}{LF} | {CR} | {LF}
!NewLine = {CR}{LF} | {CR} | {LF}
MyNewLine = {CR}{LF} | {CR} | {LF}
解决方案
他们是模糊的,因为它们都包含相同的子集 {CR}{LF} | {CR} | {LF}
.
给出的输入 {CR}{LF}
分析程序无法告知其它终端应相匹配。
表驱动的分析器真的不是设计用来处理"特殊情况"直接使用。如果你想忽略的新线在某些情况下,但属性意义,他们在其他人那么你就必须处理在减少(即标记的新行单独地,并放弃他们在你的减少),但这会变得丑陋。
一(可能)更好的解决办法是利用分析器国家(可能控制来自析),以改变行输入的标记.这很难说没有完全理解你的语法。此外,它已经几年了,因为我已经搞砸了这些东西。
其他提示
我认为文法是模棱两可的意义上说,这两个空白和MyNewLine匹配的新线字符.由于它会引发不稳定做你的方式,我建议检测的空白和新行单独决定做什么用的新行情况的基础。
我不太有经验的领域,但这就是我记得从我的理论计算类和编译器的设计类。
我希望这有所帮助。
一个迟到的答复。
我沮丧的是,我只是最近的一个晚纰漏;-)的成员。
继续使用通常基于行宣言的语法
! ====================================================================
{Whitespace Ch} = {Whitespace} - {CR} - {LF}
Whitespace = {Whitespace Ch}+
Newline = {CR}{LF} | {CR} | {LF}
! ====================================================================
空白与Newline的区别已经考虑到!
考虑解决你的特殊情况下当写入你的生产规则。
对于复杂的情况下,甚至可能需要定义的一些虚拟终端(先进技术)。
你可以阐述你的语法并要求通过发布一次。
最后编辑:请,分享如果你已经解决的问题。谢谢。
不隶属于 StackOverflow