gpt4 book ai didi

antlr - 区分标识符和变量名的巧妙方法(ANTLR)?

转载 作者:行者123 更新时间:2023-12-02 00:44:15 28 4
gpt4 key购买 nike

在 ANTLR 语法中,我们如何区分变量名和标识符?

VAR: ('A'..'Z')+ DIGIT*  ;
IDENT : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')*;

这段语法(在 ANTLR 中)不起作用,因为编译器会提示某些输入可能永远无法达到 IDENT。对于编译器编写者来说,这似乎是一个经典的头脑 Storm ,The lexer hack

对于 ANTLR 用户,您能告诉我解决这个问题的巧妙方法吗?谢谢

最佳答案

zell wrote:

The piece of grammar (in ANTLR) does not work because the compiler will complain that IDENT may never be reached for some input.

不,这是不正确的。语法如下:

grammar T;

parse
: .* EOF
;

VAR : ('A'..'Z')+ DIGIT* ;
IDENT : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')*;

fragment DIGIT : '0'..'9';

不会产生任何错误或警告。词法分析器只是创建两种类型的标记:

  1. 如果某些内容以一个或多个大写 ASCII 字母开头,后跟零个或多个数字,则会创建一个 VAR
  2. 如果某些内容以小写 ascii 字母或下划线开头,后跟 ('a'..'z'|'A'..'Z'|'0'..'9'|'_' |'-')*,创建一个 IDENT

请注意,因此IDENT 永远不能以大写ascii 字母开头:它始终会成为VAR

因此,如果您的解析器规则如下所示:

foo
: IDENT
;

并且整个输入是"BAR",那么将会出现解析器错误,因为词法分析器不会生成INDENT标记,而是生成VAR 标记,即使解析器“要求”IDENT

您必须了解,无论解析器向词法分析器询问什么,词法分析器都独立于解析器运行。

关于antlr - 区分标识符和变量名的巧妙方法(ANTLR)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8357860/

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