我一直在做这个歧义诊断工具,下面是它为你的语法设计的。看来你已经发现了更多我们需要记录和编写小检查的东西。
格式良好
\
很模糊。
问题是
\
运算符只接受文本字符串,例如
A \ "a" \ "b"
或者
keyword
非终端定义如下
keyword Hello = "a" | "b";
,用作
A \ Hello
,请
没有别的了
是的。同样
A \ ("a" | "b")
不允许,也不允许间接非终端
A\你好
哪里
lexical Hello = Bye; lexical Bye = "if" | "then"
;也不允许。只有最简单的形式。
遵循限制的良好性
类似的规则
!>>
不允许在
啊!>gt;
接线员。
所以
[a-z]+ !>> [a-z]
或
[a-z]+ !>> "*"
,但是
不
[a-z]+ \ myCharClass
哪里
lexical myCharClass = [a-z];
字符类的名称在todoy列表中;但它们不像非终端。更像是将在解析器生成器时被替换的别名。
整句话
关键字保留仅在从整个单词中减去句子时有效。有时您必须对非终端进行分组才能正确执行此操作:
-
lexical Ex = ([a-z]+ "*") \ "https*"
而不是
lexical Ex = [a-z]+ "*" \ "https*")
后者试图减去
"https*"
语言来自
"*"
语言。第一个成功了。
病例不敏感
-
'if'
由定义
lexical 'if' = [iI][fF];
-
"if"
由定义
lexical "if" = [i][f];
-
'*'
由定义
lexical '*' = [*];
-
“*”
由定义
lexical "*" = [*];
新语法
我使用一个随机生成器生成所有我能找到的歧义,并通过添加关键字reservation逐步解决它们:
lexical Scheme = AnyScheme ;
lexical AnyScheme = KnownScheme > UnknownScheme ;
lexical AnySchemeChar = [a-z*];
lexical KnownScheme = KnownSchemes !>> AnySchemeChar ;
keyword KnownSchemes = "http" | "https" | "http*" | "javascript" ;
lexical UnknownScheme = UnknownFixedScheme | UnknownWildScheme ;
lexical UnknownFixedScheme = [a-z]+ !>> AnySchemeChar \ KnownSchemes ;
lexical UnknownWildScheme = ([a-z]* '*' AnySchemeChar*) !>> AnySchemeChar \ KnownSchemes ;