我有两个表达:
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有优先运营商来克服这个问题。但无论我如何尝试设置优先级,要么一些idents执行两个操作,要么忽略一些有效字符串(有效ident作为前缀的有效字符串,例如:ab $)。
我找到了一种方法,没有使用优先级:
main := ( ident % do_ident | (string - ident) % do_string )
但如果我有多个重叠的表达式,这将变得很麻烦。这是唯一实用的方法吗?
任何有关正确方法的帮助都将不胜感激。
答案 0 :(得分:1)
查看Ragel Guide中的'6.3扫描仪'部分。
main := |*
ident => do_ident;
string => do_string;
*|;
注意:使用扫描仪时,请使用主机语言定义ts
,te
和act
。
答案 1 :(得分:1)
看起来您的问题是所有有效标识符也是有效字符串,您只是希望它尽可能先被解释为标识符。您可以通过在ident的离开操作中嵌入优先级来强制它接受标识符,这将覆盖字符串的所有转换:
main := ( ident %(ident_vs_string, 1) % do_ident | string $(ident_vs_string, 0) % do_string )
这将确保有效表达式后面的离开转换会阻止机器探索继续或留下字符串。
小心这个组合表达式是如何终止的。无论表达式如何,标识符/字符串必须以一个不允许的字符开头,以便明确定义退出转换。