负责法+金LALR分析器,无法区分特殊的情况下NewLine从空白

StackOverflow https://stackoverflow.com/questions/599409

  •  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的区别已经考虑到!

考虑解决你的特殊情况下当写入你的生产规则。

对于复杂的情况下,甚至可能需要定义的一些虚拟终端(先进技术)。

你可以阐述你的语法并要求通过发布一次。

最后编辑:请,分享如果你已经解决的问题。谢谢。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top