gpt4 book ai didi

Antlr解析数字问题

转载 作者:行者123 更新时间:2023-12-01 09:26:56 25 4
gpt4 key购买 nike

我在解析整数和十六进制数时遇到问题。我想用以下规则解析 C++ 枚举:

grammar enum;

rule_enum
: 'enum' ID '{' enum_values+ '}'';';

enum_values
: enum_value (COMMA enum_value)+;

enum_value
: ID ('=' number)?;

number : hex_number | integer_number;

hex_number
: '0' 'x' HEX_DIGIT+;

integer_number
: DIGIT+;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

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

COMMA : ',';


ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

我遇到的问题如下 - 解析如下代码时:

enum Enum
{
Option1 = 0,
Option2 = 1
};

它无法将 0 识别为 integer_number,但会尝试将其解析为 hex_number。我该如何解决这个问题?

谢谢。托拜厄斯

最佳答案

首先,片段规则只能被词法分析器规则“看到”,而不能被解析器规则“看到”。因此,以下内容无效:

integer_number
: DIGIT+; // can't use DIGIT here!

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

为了解决您对这些数字的歧义,IMO 最好使用这些 integer- 和 hex 数字词法分析器规则而不是解析器规则。

一个例子:

grammar enum;

rule_enum
: 'enum' ID '{' enum_values+ '}'';';

enum_values
: enum_value (COMMA enum_value)+;

enum_value
: ID ('=' number)?;

number
: HEX_NUMBER
| INTEGER_NUMBER
;

HEX_NUMBER
: '0' 'x' HEX_DIGIT+;

INTEGER_NUMBER
: DIGIT+;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

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

COMMA : ',';

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

SPACE : (' ' | '\t' | '\r' | '\n') {skip();};

它会生成您的示例代码段的以下解析树:

enter image description here

关于Antlr解析数字问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5038664/

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