多模式Antlr 4 Lexer无法正确标记

多模式Antlr 4 Lexer无法正确标记,antlr,lexer,Antlr,Lexer,我正在尝试使用Antlr 4.7创建一个具有多种模式的lexer。我的lexer目前是: ACTIONONLY : 'AO'; BELIEFS : ':Initial Beliefs:' -> mode(INITIAL_BELIEFS); NAME : ':name:'; WORD: ('a'..'z'|'A'..'Z'|'0'..'9'|'_')+; COMMENT : '/*' .*? '*/' -> skip ; LINE_COMMENT : '//'

我正在尝试使用Antlr 4.7创建一个具有多种模式的lexer。我的lexer目前是:

ACTIONONLY  : 'AO'; 

BELIEFS :   ':Initial Beliefs:' -> mode(INITIAL_BELIEFS);
NAME    :   ':name:';
WORD:   ('a'..'z'|'A'..'Z'|'0'..'9'|'_')+;

COMMENT : '/*' .*? '*/' -> skip ;
LINE_COMMENT : '//' ~[\n]* -> skip ;
NEWLINE:'\r'? '\n' -> skip  ;
WS  :   (' '|'\t') -> skip ;

mode INITIAL_BELIEFS;
GOAL_IB :   ':Initial Goal:' -> mode(GOALS);
IB_COMMENT : '/*' .*? '*/' -> skip ;
IB_LINE_COMMENT : '//' ~[\n]* -> skip ;
IB_NEWLINE:'\r'? '\n' -> skip  ;
IB_WS  :   (' '|'\t') -> skip ;
BELIEF_BLOCK: ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'('|')'|','|'.')+;

mode REASONING_RULES;
R1: 'a';
R2: 'b';

mode GOALS;
GL_COMMENT : '/*' .*? '*/' -> skip ;
GL_LINE_COMMENT : '//' ~[\n]* -> skip ;
GL_NEWLINE:'\r'? '\n' -> skip  ;
GL_WS  :   (' '|'\t') -> skip ;
GOAL_BLOCK: ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'('|')'|','|'.')+;
请注意,目前没有办法进入推理规则模式(因此,据我所知,这不会对lexer的操作产生任何影响)。显然,我确实想使用这种模式,但这是lexer的最低版本,它似乎显示了我遇到的问题

我的解析器是:

grammar ActionOnly;

options { tokenVocab = ActionOnlyLexer; }

// Mas involving ActionOnly Agents
mas  :  aoagents;

aoagents: ACTIONONLY (aoagent)+;

// Agent stuff
aoagent  : 
    (ACTIONONLY?) 
    NAME w=WORD  
    BELIEFS (bs=BELIEF_BLOCK )?
    GOAL_IB gs=GOAL_BLOCK;
我试图分析:

AO

:name: robot

:Initial Beliefs:

abelief

:Initial Goal:

at(4, 2)
此操作失败并出现错误

第35行:0在(4)处输入不匹配,预期目标块

我认为这是因为它没有正确地标记

如果我在推理规则模式中省略了规则R2,那么它将正确解析(一般来说,我似乎能够在推理规则中有一个规则,它将起作用,但有多个规则,它无法匹配目标块)


我真的很难看出我做错了什么,但这是我第一次尝试在Antlr中使用lexer模式。

我在尝试你的语法时没有遇到这个错误。我也用Antlr 4.7进行了测试

这是我的试验台:

import org.antlr.v4.runtime.CharStreams;
导入org.antlr.v4.runtime.CommonTokenStream;
导入org.antlr.v4.runtime.ParserRuleContext;
导入org.antlr.v4.runtime.Token;
公共班机{
公共静态void main(字符串[]args){
String source=“AO\n”+
“\n”+
“:名称:机器人\n”+
“\n”+
“:初始信念:\n”+
“\n”+
“abelief\n”+
“\n”+
“:初始目标:\n”+
“\n”+
“at(4,2)”;
ActionOnlyLexer lexer=新的ActionOnlyLexer(CharStreams.fromString(source));
CommonTokenStream令牌=新的CommonTokenStream(lexer);
tokens.fill();
System.out.println(“[TOKENS]”);
for(令牌t:tokens.getTokens()){
System.out.printf(“%-20s%s\n”,ActionOnlyLexer.词汇表.getSymbolicName(t.getType()),t.getText());
}
System.out.println(“\n[PARSE-TREE]”);
ActionOnlyParser解析器=新的ActionOnlyParser(令牌);
ParserRuleContext context=parser.mas();
System.out.println(“+context.toString树(解析器));
}
}
这会打印到我的控制台上:

[令牌]
ACTIONONLY AO
姓名:姓名:
文字机器人
信念:最初的信念:
阿贝利夫街区
目标_IB:初始目标:
在第(4)个位置的球门,
目标(单元2)
EOF
[解析树]
(mas(aoagents AO(aoagents:名称:robot:初始信念:abelief:初始目标:at(4)))
也许您需要生成新的lexer/parser类


注意,
('a''z'|'a'.'z'|'0'.'9'.''.'.'.'.'.'.'.'.')+
可以写成
[a-zA-Z0-9'.]+

你是对的。我切换了计算机,它工作了,然后我在原始计算机上手动清理了编译和生成的文件,它也工作了。我不确定我是如何让遗留文件和类挂起的,因为我认为我每次都在重建一切(我怀疑我的Eclipse设置中有一些奇怪之处).谢谢你的帮助!