Antlr4将标识符作为单个令牌进行匹配

2024-10-02 16:23:13 发布

您现在位置:Python中文网/ 问答频道 /正文

BLOCK_COMMENT : '/*' .*? '*/' -> skip;
EOL_COMMENT : '//' ~[\r\n]* -> skip;
WS: [ \n\t\r]+ -> skip;

program: usingDirectives? EOF;

usingDirectives: usingDirective+;

usingDirective: USING
        fullyQualifiedType
        (usingAlias | USING_ALL)?
        END;

USING: 'using';

fullyQualifiedType: identifier (DOT identifier)*;

identifier: (LETTER | UNDERSCORE)
        (LETTER | DIGIT | UNDERSCORE)*;

DOT: '.';

usingAlias: AS identifier;

USING_ALL: '.*';

AS: 'as';

END: ';';

LETTER: [a-zA-Z];

DIGIT: [0-9];

UNDERSCORE: '_';

这是我的语法。在

^{pr2}$

这是我的测试数据。在

语法按预期工作,但是标识符中的每个字母都变成了一个单独的标记,这有点无用。在

如果我试图将identifier设置为lexer规则(identifier),那么在运行测试时会出现以下错误:

line 1:23 extraneous input 'as' expecting {'.', '.*', 'as', ';'}

即使我试图让标识符只有[a-zA-Z],没有子规则,也会发生同样的情况。在

如果重要的话,我使用Python3作为目标语言。 请指出任何其他菜鸟的错误,因为这是我第一个使用Antlr的项目。谢谢!在


Tags: ascommentalldotendusingidentifierunderscore
1条回答
网友
1楼 · 发布于 2024-10-02 16:23:13

现在,您告诉lexer生成一个适合标识符的字符集合,而不是作为一个整体的标识符。以下简化语法(lexer和parser)应该适合您:

grammar test;

root
    : identifier*;

identifier
    : IdentifierChars;

IdentifierChars
    : [a-zA-Z0-9_]+;

WhiteSpace
   : [ \r\n\t]+ -> skip;

下面是我用来检查的Java代码示例:

^{pr2}$

下面是stdout的结果:

abc
a0bc
a_bc

相关问题 更多 >