首次尝试编写兼容语法失败.
这是语法:
! ------------------------------------------------- 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)
它们含糊不清,因为它们都包含相同的子集{CR}{LF} | {CR} | {LF}
.
给定输入{CR}{LF}
,解析器无法分辨它应匹配的终端.
表驱动的解析器并不是真正设计用于直接处理"特殊情况".如果你想在某些情境中忽略换行符,但在其他情况下要对它们赋予意义,那么你必须在缩减中处理它(即分别对换行符进行标记,并在缩减中丢弃它们),但这会变得难看.
(可能)更好的解决方案是使用标记化器状态(可能由解析器控制),以更改新行输入的标记方式.没有完全理解你的语法就很难说.此外,自从我搞砸了这些东西已经有几年了.
归档时间: |
|
查看次数: |
833 次 |
最近记录: |