【发布时间】:2020-11-24 18:57:43
【问题描述】:
我正在使用nearley and moo 提出一个相当复杂的语法。除了我的空白要求之外,它似乎工作正常。我需要在需要时要求空格,并在不需要时允许它,同时保持语法明确。
例如:
After dinner, I went to bed.
我需要在单词之间使用空格,但允许在逗号周围使用空格。所以以下也是有效的:
After dinner , I went to bed.
After dinner,I went to bed.
下面是一个快速的近乎语法试图做到这一点。 如果你不明白语法,很容易弄清楚。
// Required whitespace
rws : [ \t]+
// Optional whitespace
ows : [ \t]*
sentence -> words %ows "," sentence
| words
words -> word %rws words
-> word
word -> [a-zA-Z]
语法可能有问题,但想法是一样的。这变成了一个模棱两可的语法。如何定义明确的语法,期望可选和必需的空格?
【问题讨论】:
-
我对 Nearly 和 Moo 都不熟悉,但正则表达式可能是
whitespace : (?:[ \t]*,[ \t]*|[ \t]),而你的语法会变成word %whitespace word。希望这是有道理的,我并没有完全搞砸语言。 -
哦哦。没有考虑到这一点。什么是初始
?: -
这是一个非捕获组。不确定它是否在这里相关。可能会使用
([ \t]*,[ \t]*|[ \t])甚至只是[ \t]*,[ \t]*|[ \t]。如果你允许单词之间有多个空格,那么[ \t]*,[ \t]*|[ \t]+就可以了 -
哪一个对你有用?我可以把它变成一个答案,如果你愿意,你可以接受它
-
我在第一个建议中去掉了
?:。继续发布吧。