BNF语法+ Gold LALR解析器,无法区分特殊情况NewLine和Whitespace

时间:2009-03-01 06:57:04

标签: gold-parser

  • 我想将空格和换行视为普通的空格。
  • 我想区分换行符和其他空格,以便允许特殊情况。

首次尝试编写兼容语法失败。

这是语法:

! ------------------------------------------------- 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}

3 个答案:

答案 0 :(得分:5)

它们含糊不清,因为它们都包含相同的子集{CR}{LF} | {CR} | {LF}

鉴于输入{CR}{LF},解析器无法分辨哪个终端应匹配。

表驱动的解析器并不是真正设计用于直接处理“特殊情况”。如果你想在某些情境中忽略换行符,但在其他情况下要对它们赋予意义,那么你必须在缩减中处理它(即分别对换行符进行标记,并在缩减中丢弃它们),但这会变得难看

(可能)更好的解决方案是使用标记化器状态(可能由解析器控制),以更改新行输入的标记方式。没有完全理解你的语法就很难说。此外,自从我搞砸了这些东西已经有几年了。

答案 1 :(得分:4)

我认为语法是不明确的,因为Whitespace和MyNewLine都匹配新的行字符。由于它按照你的方式摇摆不定,我建议分别检测空白和新行,并根据具体情况决定如何处理换行。

我在该领域并不是很有经验,但这就是我在计算类和编译器设计课程中所记得的。

我希望这会有所帮助。

答案 2 :(得分:0)

迟到的答案。

令我沮丧的是,我只是一个刚出现的大器晚成员;-)成员。

继续使用通常的基于行的语法声明

! ====================================================================
{Whitespace Ch} = {Whitespace} - {CR} - {LF}

Whitespace = {Whitespace Ch}+
Newline    = {CR}{LF} | {CR} | {LF}
! ====================================================================

已考虑到空白与新线的区别!

在编写生产规则时,请考虑解决您的特殊情况。

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

您可以详细说明您的语法,然后再次发帖。

上次修改:如果您已解决此问题,请分享。感谢。