gpt4 book ai didi

grammar - 不明白为什么 Bison 扔 "Rules useless in parser due to conflicts"

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

我正在为一种非常简单的编程语言编写 BNF 语法,并使用 Flex 和 Bison 进行编译。
我只有 3 种变量和常量类型:实数、整数、字符串。
我的 .l 文件具有“ID”的 token 定义,如下所示:

DIGIT [0-9]
LETTER [a-zA-Z]
ID {LETTER}({LETTER}|{DIGIT})*

我的 .y 文件有一个 标识符 的定义,如下所示:
identifier:
ID;

现在,我想使用 标识符 定义来构建变量和常量名称。但我也想限制对相同类型数据的分配(例如,我不希望将字符串分配给整数变量)。所以我创建了一些规​​则来区分每种变量和常量:
id_variable_string:
identifier;

id_variable_integer:
identifier;

id_variable_real:
identifier;

我对常量做了同样的事情。
现在,在我的语言中,我有一个用于常量声明/定义的部分,然后是一个用于变量声明的部分。也就是说,常量在被赋值的同时被声明(类似于“myConstant = 123”),但必须首先声明变量,然后在专门为语句设计的部分中赋值。
例如,如果我想要一个整数和一个字符串变量,我必须先声明它们:
字符串 myStrVariable;
整数 myIntVariable;
然后,在为语句保留的区域中,我可以选择进行赋值(语句可以是赋值、决策、选择、输出等):
assignment: 
id_variable_string ASSIGN_OPERATOR literal_string
| id_variable_string ASSIGN_OPERATOR id_const_string
| id_variable_string ASSIGN_OPERATOR id_variable_string
| id_variable_string ASSIGN_OPERATOR concatenacion
| id_variable_integer ASSIGN_OPERATOR id_const_integer
| id_variable_integer ASSIGN_OPERATOR id_variable_integer
| id_variable_integer ASSIGN_OPERATOR expression
| id_variable_integer ASSIGN_OPERATOR literal_integer
| id_variable_real ASSIGN_OPERATOR id_variable_real
| id_variable_real ASSIGN_OPERATOR id_const_real
| id_variable_real ASSIGN_OPERATOR expression
| id_variable_real ASSIGN_OPERATOR literal_real
;

我在这里的意图是明确说明一个字符串变量只能被分配一个字符串文字、一个字符串的串联(使用 +)、一个字符串常量或另一个字符串变量。整数变量和实变量都是一样的,只是它们不能被分配一个连接而是一个表达式(数学运算)。
连接定义如下:
concatenation:
id_variable_string ADD_OPERATOR id_variable_string
| id_variable_string ADD_OPERADOR literal_string
| literal_string ADD_OPERADOR id_variable_string
| literal_string ADD_OPERADOR literal_string
| id_const_string ADD_OPERADOR id_const_string
| id_const_string ADD_OPERADOR id_variable_string
| id_const_string ADD_OPERADOR literal_string
| literal_string ADD_OPERADOR id_const_string
| id_variable_string ADD_OPERADOR id_const_string
;

表达式定义为:
expression: 
expression ADD_OPERATOR term
| expression SUBST_OPERADOR term
| term
;

term:
term MULTIP_OPERATOR factor
| term DIVISION_OPERATOR factor
| factor
;

factor:
id_variable_integer
| id_variable_real
| id_const_integer
| id_const_real
| literal_integer
| literal_real
| PARENTHESIS_OPEN expression PARENTHESIS_CLOSE
;

现在,这就是 Bison 所说的:

55 赋值:id_variable_integer ASSIGN_OPERATOR id_const_integer
56 | id_variable_integer ASSIGN_OPERATOR id_variable_integer
58 | id_variable_integer ASSIGN_OPERATORliteral_integer
59 | id_variable_real ASSIGN_OPERATOR id_variable_real
60 | id_variable_real ASSIGN_OPERATOR id_const_real
62 | id_variable_real ASSIGN_OPERATORliteral_real

状态 50 冲突:1 次转变/减少
状态 76 冲突:14 shift/reduce
状态 130 冲突:2 shift/reduce
状态 131 冲突:1 次转变/减少
状态 133 冲突:1 移位/减少
状态 134 冲突:1 类/减少
状态 135 冲突:1 次转变/减少
状态 137 冲突:1 次转变/减少
状态 138 冲突:1 次转变/减少

我假设我的语法中有一些错误,但我不确定到底是什么。

最佳答案

你说:

So I created a few rules to separate each kind of variable and constant:

id_variable_string:
identifier;

id_variable_integer:
identifier;

id_variable_real:
identifier;


这是你的问题。在语法上没有什么可以区分 id_variable_stringid_variable_integer ,所以你有(至少两个)浪费的规则。这就是它所提示的。它不知道何时获得 identifier 是应该将其视为 id_variable_string 还是 id_variable_integer

您必须以不同的方式处理类型冲突——语义检查(而不是语法检查)与标识符关联的类型与表达式中其他标识符的类型一致。

关于grammar - 不明白为什么 Bison 扔 "Rules useless in parser due to conflicts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19918580/

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