首次尝试编写兼容语法失败。
这是语法:
! ------------------------------------------------- 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}
答案 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}
! ====================================================================
已考虑到空白与新线的区别!
在编写生产规则时,请考虑解决您的特殊情况。
对于复杂的情况,您甚至可能需要定义一些虚拟终端(高级技术)。
您可以详细说明您的语法,然后再次发帖。
上次修改:如果您已解决此问题,请分享。感谢。