gpt4 book ai didi

antlr - 如何使用 ANTLR 区分保留字和变量?

转载 作者:行者123 更新时间:2023-12-04 14:32:38 28 4
gpt4 key购买 nike

我正在使用 ANTLR 来标记一个简单的语法,并且需要区分一个 ID:

ID              : LETTER (LETTER | DIGIT)* ;

fragment DIGIT : '0'..'9' ;
fragment LETTER : 'a'..'z' | 'A'..'Z' ;

和一个 RESERVED_WORD:
RESERVED_WORD : 'class' | 'public' | 'static' | 'extends' | 'void' | 'int' | 'boolean' | 'if' | 'else' | 'while' | 'return' | 'null' | 'true' | 'false' | 'this' | 'new' | 'String' ;

假设我在输入上运行词法分析器:
class abc

我收到了“class”和“abc”的两个 ID token ,而我希望将“class”识别为 RESERVED_WORD。我怎样才能做到这一点?

最佳答案

每当 2 个(或更多)规则匹配相同数量的字符时,第一个定义的规则将“获胜”。所以,如果你定义 RESERVED_WORD之前 ID , 像这样:

RESERVED_WORD : 'class' | 'public' | 'static' | 'extends' | 'void' | 'int' | 'boolean' | 'if' | 'else' | 'while' | 'return' | 'null' | 'true' | 'false' | 'this' | 'new' | 'String' ;

ID : LETTER (LETTER | DIGIT)* ;

fragment DIGIT : '0'..'9' ;
fragment LETTER : 'a'..'z' | 'A'..'Z' ;

输入 "class"将被标记为 RESERVED_WORD .

请注意,创建与任何保留字匹配的单个标记没有多大意义:通常是这样完成的:
// ...

NULL : 'null';
TRUE : 'true';
FALSE : 'false;

// ...

ID : LETTER (LETTER | DIGIT)* ;

fragment DIGIT : '0'..'9' ;
fragment LETTER : 'a'..'z' | 'A'..'Z' ;

现在 "false"将成为 FALSE token 和 "falser" ID .

关于antlr - 如何使用 ANTLR 区分保留字和变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9726620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com