使用空格分隔的表达式列表 + if/then/else 解决野牛语法中的冲突

塞巴斯蒂安·格拉夫

我有以下 yacc/bison/happy 语法:

%token 
  if              TokenIf
  then            TokenThen
  else            TokenElse
  true            TokenTrue
  false           TokenFalse

%left APP
%right IF

%%

Hungry
  : NoHungry
  | Hungry NoHungry %prec APP
  | if Hungry then Hungry else Hungry %prec IF

NoHungry
  : true
  | false

bison -v 告诉我在以下情况下有两个冲突:

State 12

    2 Hungry: Hungry . NoHungry
    3       | if Hungry then Hungry else Hungry .

    true   shift, and go to state 2
    false  shift, and go to state 3

    true      [reduce using rule 3 (Hungry)]
    false     [reduce using rule 3 (Hungry)]
    $default  reduce using rule 3 (Hungry)

    NoHungry  go to state 8

我试图通过使用 给出明确的优先级声明来解决冲突%prec,但无济于事。鉴于野牛根据需要解决冲突(例如,转移而不是减少),这还不错,但我想知道我们如何在不改变公认语言的情况下摆脱冲突。

从 bison 报告中可以看出,冲突与未在优先关系中列出的终端truefalse因此,优先规则不适用于这些冲突。

回想一下,产生式和终结符之间定义了优先关系。它不涉及两个终端或两个产生式(因此不能用于解决归约冲突)。可以减少的产生式的优先级与先行终端之间的比较确定是否会发生减少或移位。为了符号方便,产生式由终端的名称表示,通常是产生式中唯一的终端;这对应于一个常见的用例,但有时令人困惑。特别是,%prec声明仅用于为规则命名以在优先声明中使用,并且最好以这种方式考虑它而不是作为“显式”声明来考虑它。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

简而言之,您问题中简化语法的冲突可以通过在优先关系中显式添加适当的终结符来解决:

%precedence "if"
%precedence "true" "false"

%%

Hungry
  : NoHungry
  | Hungry NoHungry
  | "if" Hungry "then" Hungry "else" Hungry %prec "if"

NoHungry
  : "true"
  | "false"

摘自-v输出:

State 12

    2 Hungry: Hungry . NoHungry
    3       | "if" Hungry "then" Hungry "else" Hungry .

    "true"   shift, and go to state 2
    "false"  shift, and go to state 3

    $default  reduce using rule 3 (Hungry)

    NoHungry  go to state 8

通过使用-r solved代替-v,您可以更明确地看到分辨率:

    Conflict between rule 3 and token "true" resolved as shift ("if" < "true").
    Conflict between rule 3 and token "false" resolved as shift ("if" < "false").

我可以用作生产"else"的名称if,如果没有%prec声明,这将是默认值,但"if"似乎更直观。

%precedence声明(近野牛版本)并不意味着左边或右边的关联性; 在这种情况下,结合性不适用,因为在冲突中不存在涉及同等优先级的产生和终结的情况。如果 Happy 没有实现它,%left或者%right可以出于相同的原因使用它(关联性无关紧要),但我认为%precedence更好地记录这种情况。

由于这无疑是一个简化的例子,值得注意的是,更完整的语法需要一些语法分析。特别是,优先级大于"if"必须包含 中的所有终端的终端列表FIRST(NoHungry),并且 bison 不提供执行该计算的自动工具,尽管您通常可以从 shift-reduce 冲突报告中提取列表。(它甚至可能"if"是集合的一部分,在这种情况下,结合性很重要。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用正则表达式匹配分隔列表中的子字符串

来自分类Dev

正则表达式以获取文件中单词使用和分号之间的逗号分隔列表

来自分类Dev

正则表达式以分隔列表中的项目

来自分类Dev

仅当子字符串中不包含空格时,才使用正则表达式进行分隔

来自分类Dev

正则表达式,使用 Python 中包含空格的表达式

来自分类Dev

正则表达式删除带有引号分隔文本的csv文件中的空格?

来自分类Dev

正则表达式-从列表中搜索连续元素而无需尾随空格并开始空格

来自分类Dev

解决 sympy 中的表达式列表

来自分类Dev

正则表达式提取键-值对,该键/值对用空格分隔,值中包含空格

来自分类Dev

如果未用空格或空格分隔,则在正则表达式中连接多个字符串

来自分类Dev

使用正则表达式拆分字符串时,请跳过用逗号分隔的字符串中的空格

来自分类Dev

转变减少野牛语法中的冲突

来自分类Dev

在角度表达式中添加空格

来自分类Dev

正则表达式,用于以逗号分隔的列表中的多个搜索

来自分类Dev

正则表达式匹配逗号分隔列表中的单词

来自分类Dev

正则表达式以逗号分隔列表中的单词匹配

来自分类Dev

使用 lambda 表达式循环并检查列表中的条件

来自分类Dev

带正则表达式的awk中的自定义字段分隔符:前导空格和逗号问题

来自分类Dev

如何检查整个输入字符串(用空格分隔的实数)是否与Python中的正则表达式匹配?

来自分类Dev

组合表达式列表中的表达式

来自分类Dev

是否存在一个语法合法的表达式,该表达式具有两个仅由C#中的空格分隔的连续标识符?

来自分类Dev

用于检查字符串中单词的正则表达式仅由空格分隔,而不是由 _AND_/_OR_ python 分隔

来自分类Dev

ArgumentException调用Expression.IfThenElse

来自分类Dev

使用正则表达式(Oracle)从竖线分隔的字符串中获取值

来自分类Dev

Android Kotlin-意外令牌(使用';'分隔同一行中的表达式)

来自分类Dev

sed:使用§作为分隔符时替换表达式中的错误选项

来自分类Dev

Python:从非分隔字符串中获取数字。使用正则表达式?

来自分类Dev

解决Maven表达式中的列表项

来自分类Dev

asp.net中的正则表达式仅允许使用单个空格的字符?

Related 相关文章

  1. 1

    使用正则表达式匹配分隔列表中的子字符串

  2. 2

    正则表达式以获取文件中单词使用和分号之间的逗号分隔列表

  3. 3

    正则表达式以分隔列表中的项目

  4. 4

    仅当子字符串中不包含空格时,才使用正则表达式进行分隔

  5. 5

    正则表达式,使用 Python 中包含空格的表达式

  6. 6

    正则表达式删除带有引号分隔文本的csv文件中的空格?

  7. 7

    正则表达式-从列表中搜索连续元素而无需尾随空格并开始空格

  8. 8

    解决 sympy 中的表达式列表

  9. 9

    正则表达式提取键-值对,该键/值对用空格分隔,值中包含空格

  10. 10

    如果未用空格或空格分隔,则在正则表达式中连接多个字符串

  11. 11

    使用正则表达式拆分字符串时,请跳过用逗号分隔的字符串中的空格

  12. 12

    转变减少野牛语法中的冲突

  13. 13

    在角度表达式中添加空格

  14. 14

    正则表达式,用于以逗号分隔的列表中的多个搜索

  15. 15

    正则表达式匹配逗号分隔列表中的单词

  16. 16

    正则表达式以逗号分隔列表中的单词匹配

  17. 17

    使用 lambda 表达式循环并检查列表中的条件

  18. 18

    带正则表达式的awk中的自定义字段分隔符:前导空格和逗号问题

  19. 19

    如何检查整个输入字符串(用空格分隔的实数)是否与Python中的正则表达式匹配?

  20. 20

    组合表达式列表中的表达式

  21. 21

    是否存在一个语法合法的表达式,该表达式具有两个仅由C#中的空格分隔的连续标识符?

  22. 22

    用于检查字符串中单词的正则表达式仅由空格分隔,而不是由 _AND_/_OR_ python 分隔

  23. 23

    ArgumentException调用Expression.IfThenElse

  24. 24

    使用正则表达式(Oracle)从竖线分隔的字符串中获取值

  25. 25

    Android Kotlin-意外令牌(使用';'分隔同一行中的表达式)

  26. 26

    sed:使用§作为分隔符时替换表达式中的错误选项

  27. 27

    Python:从非分隔字符串中获取数字。使用正则表达式?

  28. 28

    解决Maven表达式中的列表项

  29. 29

    asp.net中的正则表达式仅允许使用单个空格的字符?

热门标签

归档