Antlr4不匹配复合令牌

Antlr4不匹配复合令牌,antlr4,Antlr4,我正在尝试使用Antlr4处理文件中的以下内容: process example(test){ run $test say hi } 我的语法如下所示: grammar example; main: process* EOF; processCall: processName '(' processArg ')'; process: ('process' | 'Process' | 'PROCESS') processName '(' processArg ') {' IDENTI

我正在尝试使用Antlr4处理文件中的以下内容:

process example(test){
    run $test say hi
}
我的语法如下所示:

grammar example;
main: process* EOF;

processCall: processName '(' processArg ')';

process: ('process' | 'Process' | 'PROCESS') processName '(' processArg ') {' IDENTIFIER?
        processArgReplaces IDENTIFIER? '}';
processArgReplaces: IDENTIFIER? '$' processArg IDENTIFIER?;
processName: WORD;
processArg: (WORD ',')* WORD;

WORD: [a-zA-Z0-9?_]+;

IDENTIFIER: [a-zA-Z] [ a-zA-Z0-9?_]+;
BS: [\r\n\t\f]+ -> skip;
但我的输出给我的
在“输入”过程示例名称(“

问题是我需要在某些区域支持空间

process name(arg){
    [anything here is one token]
    OR
    anotherprocess(arg) [comes out as {anotherprocess} and {arg}]
}

我已经尝试过改变标识符,因为我认为它在
过程
有机会之前接管了匹配,但是显式标记是否意味着行不只是一般的单词?

在这种情况下,打印lexer识别的标记列表总是非常有帮助的。在您的情况下,您将得到:

[@0,0:14='process example',<11>,1:0]
[@1,15:15='(',<1>,1:15]
[@2,16:19='test',<10>,1:16]
[@3,20:20=')',<2>,1:20]
[@4,27:30='run ',<11>,2:4]
[@5,31:31='$',<8>,2:8]
[@6,32:42='test say hi',<11>,2:9]
[@7,44:44='}',<7>,3:0]
[@8,46:45='<EOF>',<-1>,4:0]
这为您提供了一个很好的解析树:


在您的描述中,您将一个部分称为
[这里的任何内容都是一个标记]
。您可能想跳过所有这些,因为您对它不感兴趣。但是,我建议您仍然解析该部分(不要管它)。它需要实现空白的双重作用,您以后可能仍然需要它。

谢谢您的深入解释,Mike。我们在一天结束时基本上完成了这项工作。我们忽略了所有空格,并在Antlr中对标记进行了分组,然后在Golang解析器中我们知道了“进程体”token包含X个子标记,我们可以迭代并用空格连接它们。正如您所指出的,最终空格和尝试用“english”和Antlr对事物进行分组是最大的问题。
grammar Example;

start: process* EOF;

processCall: processName OPEN_PAR processArg CLOSE_PAR;

process:
    PROCESS processName OPEN_PAR processArg CLOSE_PAR OPEN_CURLY IDENTIFIER? processArgReplaces IDENTIFIER? CLOSE_CURLY
;
processArgReplaces: IDENTIFIER? DOLLAR processArg IDENTIFIER?;
processName:        IDENTIFIER;
processArg:         (IDENTIFIER COMMA)* IDENTIFIER;

OPEN_PAR:    '(';
CLOSE_PAR:   ')';
OPEN_CURLY:  '{';
CLOSE_CURLY: '}';
COMMA:       ',';
DOLLAR:      '$';

PROCESS: [pP] [rR] [oO] [cC] [eE] [sS] [sS];

IDENTIFIER: [a-zA-Z] [a-zA-Z0-9?_]+;
WS:         [ \r\n\t\f]+ -> skip;