gpt4 book ai didi

c++ - Bison 中的错误报告和 token 别名

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:31 24 4
gpt4 key购买 nike

好的,所以我正在试验 token 别名并面临一些问题。

让我们以我的(超简化的)Bison 语法的这一部分为例:

/****************************************
Definitions
****************************************/

%union
{
char* str;
}

/****************************************
Tokens & Types
****************************************/

%token <str> ID "identifier"
%token <str> NUMBER_DEC "number"
%token <str> NUMBER_HEX "number"
%token <str> NUMBER_BIN "number"
%token <str> NUMBER_FLOAT "number"

%type <str> identifier number
%type <str> assignment_st
%type <str> statements statement
%type <str> program

/****************************************
Directives
****************************************/

%glr-parser
%locations
%start program
%define parse.error verbose
%%


/****************************************
Grammar Rules
****************************************/

identifier : ID
;

number : NUMBER_DEC
| NUMBER_HEX
| NUMBER_BIN
| NUMBER_FLOAT
;

assignment_st : identifier '=' number ';' { printf("assignment : %s = %s\n",$identifier,$number); }
;

statement : assignment_st
;

statements : statement
| statements statement
;

program : statements
;

%%

现在,如果我尝试 a = 2;,这显然符合语法。如果我尝试 a = b; 这是一个错误,因为它需要一个数字。在这种情况下,解析器报告:

syntax error, unexpected identifier, expecting number or NUMBER_HEX or NUMBER_BIN or NUMBER_FLOAT

(好吧,“数字”别名重复的,因为它在 4 个标记中使用)。

但是,我会寻找更像 unexpected identifier, expected number 的东西。

你会怎么做?

此外,我是否有可能将错误行也包含在消息中?


P.S. 几个小时以来,我一直在研究最新的 Bison 文档,但我觉得我最终会 build 一个...火箭而不是修复错误消息...大声笑

最佳答案

How would you go about it?

我会使用单个 NUMBER 标记。我看不出有任何理由让解析器关心它正在查看的是哪种类型的数字文字。

当然,您的完整语法可能确实涉及只允许某些格式的数字文字的地方,尽管我对这类事情的一般倾向是“yuk”。最可能的可能性是存在一些规则,其中整数常量是可以的,但浮点常量不是。在那种情况下,除非您为 float 提供与整数不同的别名,否则您将不会收到针对该特定产品的正确错误消息。不过,总的来说,我坚持使用“yuk”。

如果您有一个单一的数字标记类型,别名为“number”,那么错误应该可以正常解决。

关于c++ - Bison 中的错误报告和 token 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22388218/

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