【发布时间】:2014-02-23 09:41:50
【问题描述】:
我有两种表达方式:
ident = alpha . (alnum|[._\-])*;
string = (printable1)+;
# Printable includes almost all Windows-1252 characters with glyphs.
main := ( ident % do_ident | string % do_string )
# The do_* actions have been defined, and generate tokens.
显然,任何 ident 都是一个字符串。 Ragel 有优先操作员来克服这个问题。但无论我如何尝试设置优先级,要么某些 ident 执行这两个操作,要么忽略某些有效字符串(以有效 ident 作为前缀的有效字符串,例如:ab$)。
我找到了一种不使用优先级的方法:
main := ( ident % do_ident | (string - ident) % do_string )
但是如果我有多个重叠的表达式,这会变得很麻烦。这是唯一可行的方法吗?
任何有关正确方法的帮助将不胜感激。
【问题讨论】:
-
我和你有同样的问题。你找到一个好的答案吗?还是按照您的建议保留它?
-
我最终采用了上面的方法,从低优先级的定义中减去了各种高优先级的定义。事实证明,我只需要对 14 种模式中的 4 种执行此操作。生成的代码并不漂亮,但它可以工作。
标签: ragel