ANTLR 中的保留关键字规则

问题描述 投票:0回答:1

我是 Antlr4 的新手。

有g4语法规则:

Function
: first
| second
| third
;

first
: FIRST'(' (STRING) (',' firstMode)? ')'
;

firstMode
: A
| B
;

A
: '"' F I R S T '"'
;

B
: '"'F I R S T D A Y'"'
;

STRING
: '"' .*? '"'
;

我希望“FIRST”在 FIRST("string", "FIRST") 上下文中为 A 通常当我写“FIRST”或“FIRST”或类似的东西时,我希望“FIRST”是字符串类型。如何得到我想要的?

antlr antlr4
1个回答
0
投票

一定数量的输入字符无法标记为 2 种不同的标记类型。因此输入

"first"
将始终成为
A
标记,因为它是在
STRING
标记之前定义的。

如果你想以多种方式识别这些东西,请在解析器中这样做:

first
 : FIRST '(' string (',' firstMode)? ')'
 ;

string
 : A
 | STRING
 ;

A
 : '"' F I R S T '"'
 ;

STRING
 : '"' .*? '"'
 ;

编辑

测试语法:

grammar T;

parse
 : first EOF
 ;

first
 : FIRST '(' string ( ',' firstMode )? ')'
 ;

string
 : FIRST
 | FIRSTDAY
 | STRING
 ;

firstMode
: FIRST
| FIRSTDAY
;

FIRST
 : '"' F I R S T '"'
 ;

FIRSTDAY
 : '"' F I R S T D A Y '"'
 ;

STRING
 : '"' .*? '"'
 ;

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

F : [fF];
I : [iI];
R : [rR];
S : [sS];
T : [tT];
D : [dD];
A : [aA];
Y : [yY];

使用输入

"FIRST"("FIRSTDAY", "FIRST")
,得到以下解析树:

© www.soinside.com 2019 - 2024. All rights reserved.