无法弄清楚为什么 Bison 抛出“由于冲突,规则在解析器中无用”

2024-05-11

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

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”),但必须首先声明变量,然后在专门为语句设计的部分中赋值。
例如,如果我想要一个整数和一个字符串变量,我必须首先声明它们:
STRING 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 | 56 id_variable_integer ASSIGN_OPERATOR id_variable_integer
58 | 58 id_variable_integer ASSIGN_OPERATOR 文字_整数
59 | 59 id_variable_real ASSIGN_OPERATOR id_variable_real
60| id_variable_real ASSIGN_OPERATOR id_const_real
62 | 62 id_variable_real ASSIGN_OPERATOR 文字_real


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


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


你说:

所以我创建了一些规​​则来区分每种变量和常量:

id_variable_string:
identifier;

id_variable_integer:
identifier;

id_variable_real:
identifier;

这就是你的问题。没有任何语法可以区分id_variable_string从一个id_variable_integer,所以你有(至少两个)浪费的规则。这就是它所抱怨的。它不知道什么时候得到identifier是否应该将其视为id_variable_string or an id_variable_integer.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法弄清楚为什么 Bison 抛出“由于冲突,规则在解析器中无用” 的相关文章

  • 使用 Flex 生成的文件时出现问题

    我正在尝试设置一个使用 flex 的项目 fast lex 而不是 adobe 我在 Ubuntu 上运行 并通过 apt get 方法安装了 flex 我用谷歌搜索了编译错误 我要么找到了围绕它创建自己的补丁的人 要么找到了很多论坛 人们
  • 不使用左手递归解析布尔表达式

    我正在尝试匹配这个 f some thing something else f 某物 是一个函数调用 它是一个表达式 是一个布尔运算符 别的东西 是一个字符串 也是一个表达式 所以布尔表达式应该是 expression operator e
  • 语法写作工具[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试用 EBNF 编写语法 除非有很好的理由 否则它必须是 EBNF 并且正在寻找一些实用程序 如果有一个 GUI 界面可以制作一个
  • Flex/Bison IDE? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个良好的开发环境 可以在 Flex 或 Bison 或两者上工作 是否有任何 IDE 具有
  • 如何将 lex 文件中的 yytext 传递给 yacc?

    请我面临一个简单的问题 这就是问题 在我的 lex 文件中 我有类似的内容 char ptr String name BEGIN sName
  • flex 中 yywrap() 的含义

    该指令在 flex lex 中意味着什么 define yywrap 1 和这个 t 我在下面的代码中找到它 t putchar t 输入 你好世界 输出 你好世界 根据Lex 和 Yacc 页面 http dinosaur compile
  • Perl 6 规则中 .parse 锚点还是 :sigspace 首先?

    我有两个问题 我表现出的行为是否正确 如果是 它是否记录在某处 我在玩语法TOP方法 宣布为rule 它意味着字符串的开头和结尾锚点以及 sigspace grammar Number rule TOP d my strings 137 1
  • 为什么这个 c# 代码片段是合法的?

    愚蠢的问题 但是为什么下面的行会编译 int i new int 1 正如您所看到的 我没有输入第二个元素并在那里留下了逗号 即使您希望它不会编译 仍然可以编译 我想是因为 ECMA 334 标准说 array initializer va
  • LR(k) 到 LR(1) 语法转换

    我对以下内容感到困惑quote http en wikipedia org wiki LR parser Theory来自维基百科 换句话说 如果一种语言足够合理 允许 高效的单遍解析器 可以用 LR k 语法来描述 语法总是可以机械地转化
  • 如何解决2+2和2++2冲突

    在更大的程序中 我给出了以下内容 flex bison In flex pn dig 0 9 exp e E dig printf detected n return PLUS SIGN pn dig printf digit detect
  • Epsilon(ε) 产生式以及 LR(0) 语法和 LL(1) 语法

    在很多地方 例如在这个答案中here https stackoverflow com a 8496838 7571421 我看到有人说 LR 0 语法不能包含 产生式 Also in 维基百科 https en wikipedia org
  • BNF 可以处理远期消费吗?

    最近我发现了 python 模块pyparsing 一个通过编写来解析数据的绝佳工具grammar 而不是解析器 我对上下文无关语法的概念很陌生 所以请纠正这个问题中的任何错误假设 Pyparsing 可以实现 BNF 巴科斯 诺尔范式 h
  • 如何将 C++ flex 与 C++ Bison 连接起来?

    我正在尝试将 C flex 与 C bison 连接起来 但我被难住了 Bison 3 8 1 手册有一个带有 C Flex 的 C Bison 示例 Flex 2 6 4 没有示例 我试图解决的问题是如何向 C 或 C Bison 提供指
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • _实际_ Twitter 主题标签格式?不是你的正则表达式,也不是他的代码——真正的代码?

    更新 如果可以的话 请使用 Twitter 的实体 他们为您以及其他项目找到了解决方案 我的情况是 我只有没有实体的推文和所有额外的元数据 我花了我认为不合理的时间试图找到actual主题标签的格式 据我搜索得知 Twitter 尚未发布任
  • 如何将flex和bison与Qt项目集成?

    我正在 git 源代码控制下使用 Qt4 制作 GUI 程序 Github页面 https github com vinayak garg dic sim 项目的一小部分需要扫描和解析 所以我想在项目中使用flex和bison 我能想到3种
  • BISON + FLEX 语法 - 为什么标记被连接在一起

    我想了解为什么 BISON 按照以下规则连接两个标记 stmt declaration assignment exp ID lt this rule fprintf stderr n my id is s 1 如果你检查输出就会明白我的意思
  • 我正在尝试为 Antlr4 Python3.g4 语法文件生成解析树,以解析 python3 代码

    我正在使用 ANTLR4 并尝试为我拥有的 python 文件生成解析树 我使用了 ANTLR4 文档中的语法文件 python3 g4 我安装了antlr4 python3 runtime 并且运行了以下命令 antlr4 Dlangua
  • Bison:奇怪的转变-减少冲突

    我尝试在自定义语法中实现函数调用 加上类似的数组访问运算符 expression OTHER EXPRESSION RULES expression PARENTHESIS OPEN expressions PARENTHESIS CLOS
  • 规则永远不会减少,了解原因

    我正在学习使用 YACC 但我真的无法理解一些错误 我想知道为什么当我尝试使用 y 文件生成解析器时会出现此错误 这是我的 y 文件 它代表 Pascal 语言的上下文无关语法 Program program ident declarati

随机推荐