ANTLR解析MismatchedTokenException
|
我正在尝试为我正在编写的更简单的语言编写一个简单的解析器。它由后缀表达式组成。截至目前,解析器出现问题。在输入“ 0”上运行它时,我得到一个MismatchedTokenException。
另外,我将如何实现递归后缀解析器?
这是我的代码:
grammar star;
options {
language=Python;
output=AST;
ASTLabelType=CommonTree;
}
tokens {DECL;}
//start
// : decl ;
//decl
// : type ID -> ^(DECL type ID)
// ;
program
: (body)+
;
body : (nested WS)*
| (var WS)*
| (get WS)*
;
var
: nested ID \'>>\'
;
get
: ID \'<<\'
;
//expressions
term
: INT
;
expr
: term (term operator)*
;
nested
: expr (expr operator)*
;
operator
: (\'*\' | \'+\' | \'/\' | \'%\' | \'-\')
;
ID
: (\'a\'..\'z\' | \'A\'..\'Z\') (\'a..z\' | \'0\'..\'9\' | \'A\'..\'Z\')*
;
INT
: \'0\'..\'9\'+
;
WS
: (\' \' | \'\\n\' | \'\\t\' | \'\\r\') {$channel=HIDDEN;}
;
没有找到相关结果
已邀请:
2 个回复
掀辟髓观粟
令牌放在
通道上,这使得解析器规则无法使用它们。因此,您的
规则中的所有
令牌都不正确。 2 _(您的最新编辑删除了左递归问题,但我仍然要对此表示抱歉,您的其他问题具有左递归规则(
),因此我将在此处保留此信息)_ ANTLR是LL解析器生成器,因此您可以创建左递归语法。以下是递归的:
因为
规则内的第一个
可能与
规则本身匹配。像任何LL解析器一样,ANTLR生成的解析器无法应对左递归。 3 如果解决了
问题,则
规则将产生以下错误消息: (1/7)决策可以使用多种选择匹配输入,例如\“ INT \” 这意味着解析器无法“查看”
令牌所属的规则。这是由于您所有的
选项都可以重复零次或更多次,并且times6ѭ和
也可以重复。他们都可以匹配
,这是ANTLR抱怨的。如果这样删除remove18ѭ\:
错误会消失(尽管那仍然不会导致您的输入被正确解析!)。 我意识到这听起来似乎还很含糊,但是要解释(或理解您是否是这一切的初学者)并非易事。 4 为了正确地说明
中的递归
,您将需要避免左递归,如我在#2中所述。您可以这样做:
仍然是模棱两可的,但这是在使用LL语法描述后缀表达式的情况下,不可避免的AFAIK。要解决此问题,您可以在语法的“ 23”部分中启用全局回溯:
演示版 关于如何解析递归表达式的一些演示如下所示:
测试脚本:
产生以下输出: -- + 5 * + 1个 2 4 3 对应于以下AST:
递劝臼类洪
如果您有兴趣调试此测试用例,则显示以下AX语法,在打印时设置断点以逐步通过解析器: