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

2 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}
Run Code Online (Sandbox Code Playgroud)

Bra*_*non 5

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

给定输入{CR}{LF},解析器无法分辨它应匹配的终端.

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

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