|
1
2
首先,我是ll解析器的粉丝,所以我非常赞同您的方法。注意,最新流行的解析器生成器之一( ANTLR 是LL。如果您允许更多的前瞻性,而不是将自己限制在ll(1)上,那么您可以使用lr(1)解析器做任何您想做的事情,但是代码将更加清晰、可靠和易于调试。 我对你的整体语法不太了解。您可能能够设计一些东西,以便ll解析器始终能够从上下文中判断它是整数表达式还是日期常量。但是,假设你不能,是的,你需要某种方法来区分。我唯一能想到的是用反斜杠代替斜杠作为分隔符,但这有点难看。 |
|
|
2
2
您需要的是一个具有无限前瞻性的类似ll的无词汇解析器。也就是说,它是peg。 http://en.wikipedia.org/wiki/Parsing_expression_grammar 有了有序的选择,就很容易避免这种日期与常量文字划分的混淆。 |
|
|
3
0
当一种语言是为人类输入的时候,定义它同样是一个问题
满足第二个需求比第一个要困难得多,需要深入了解
基本上,如果不能很好地掌握预期的用法和用户,就很难对语言语法提出建议。
对日期值使用其他格式
;对于用户来说是“自然”的,但对于普通语法来说却足够独特。
不管怎样,只是想法…适用性将因提及的人类/文化因素而异, 和 其他的语法。例如,上面的内容可能意味着要显式地标记变量(这是许多语言使用$前缀的原因之一),以避免可能与[奇数,但可能的]变量标识符冲突。 简言之,其思想是通过使12个月标记对解析器来说是一个足够好的鉴别器来代替对特殊字符前缀的需要(这可能会与使用这些字符进行数学和其他表达式相冲突)。 |