1

我有 2 种表达方式:

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 )

但是如果我有多个重叠的表达式,这将变得很麻烦。这是唯一实用的方法吗?

任何有关正确方法的帮助将不胜感激。

4

2 回答 2

1

请查看Ragel 指南中的“6.3 扫描仪”部分。

main := |*
    ident  => do_ident;
    string => do_string;
*|;

注意:使用扫描仪时,请ts在宿主语言中定义te、 和。act

于 2014-02-04T12:26:57.120 回答
1

看起来您的问题是所有有效的标识符也是有效的字符串,如果可能的话,您只希望它首先被解释为标识符。您可以通过在 ident 的离开操作中嵌入优先级来强制它首先接受标识符,这会覆盖字符串的所有转换:

main := ( ident %(ident_vs_string, 1) % do_ident | string $(ident_vs_string, 0) % do_string )

这将确保跟随有效表达式的离开转换停止机器探索继续或离开字符串。

注意这个组合表达式是如何终止的。标识符/字符串后面的任何表达式都必须以两者都不允许的字符开头,以便很好地定义退出转换。

于 2014-10-02T23:07:55.297 回答