ANTLR4如何实现「不可出现在指定规则之后」的语法规则匹配?
错误原因
- 你完全误解了ANTLR4中
~运算符的功能和使用限制:~仅作用于当前匹配位置的内容,用于表示当前位置不匹配右侧的符号,根本不能用于校验前序位置的内容,你要实现的“前面不能是onset”的逻辑,和~的功能完全不匹配。~仅支持对词法Token、字符集、单个Token类型取反,不支持作用在解析器规则(比如你定义的onset解析规则)上,这是你报no viable alternative at input '~onset'错误的直接原因,和是否换行写没有任何关系。
- 你现有的音节规则本身已经隐含了你要的限制:你定义的
syllable: onset? nucleus coda?;本身就强制了coda只能跟在nucleus之后,不可能直接出现在onset后面,完全不需要在coda规则里额外加否定校验。
正确写法
场景1:仅在syllable规则内引用coda
直接简化coda规则即可,现有结构已经满足你的逻辑要求:
syllable : onset? nucleus coda? ; coda : consonant ;
场景2:存在单独引用coda的场景,必须限制前序不能出现onset
使用ANTLR语义谓词实现前置校验即可,示例如下(需根据你实际onset匹配的Token类型调整判断逻辑):
// 假设onset匹配的辅音Token类型为P、T、K、B、D、G coda : { int prevTokenType = _input.LT(-1).getType(); prevTokenType != P && prevTokenType != T && prevTokenType != K && prevTokenType != B && prevTokenType != D && prevTokenType != G }? consonant ;
内容的提问来源于stack exchange,提问作者Miranda N
相关产品推荐
相关产品推荐

