【问题标题】:flex and bison: how to recognize an arrayflex 和 bison:如何识别数组
【发布时间】:2012-11-12 15:05:21
【问题描述】:

我正在使用 bison 和 flex 来了解口译员的工作方式。我已经做了几件事,比如范围({INT:INT}{INT:INT:INT})、字符串({string"here come any text"})等,但我无法决定哪种方法应该是帮助野牛理解的正确方法如果用户以[INT, INT, ID, ID, INT, ..., INT, ID, ID...] 的形式输入数组?

首先想到的是使用 flex 关键字 BEGIN 然后一直查看到行尾,但这似乎很愚蠢,因为您需要很多东西来了解下一个成员是 INT 还是 ID,并且这不是什么好方法。我还能做什么?我宁愿用野牛做这件事,但我不知道如何让野牛看起来在[] 之间递归以获取它们包含的所有内容。我该怎么做?

提前致谢!

【问题讨论】:

  • 你知道如何构造一个 LR(1) 上下文无关文法来识别这样一个数组吗?还是您的问题是如何将其转换为 Bison 可以理解的格式?
  • 不知道。或许您可以推荐一些书籍或链接来阅读?
  • 灰姑娘书:自动机理论、语言和计算简介。 4 个版本(包括“0th”)在一定程度上明显不同:en.wikipedia.org/wiki/…——我不确定,但我认为这涵盖了 CFG 和 LR(1) 语法等,如果可能的话——抽象的角度。您的背景中有很多正式的计算机科学理论吗?
  • @Yakk:不,我根本没有,因为我是语言学家。 :-)
  • @DeadMG,你有替代文字建议吗?

标签: c++ bison flex-lexer


【解决方案1】:

简单——只需制定一个递归规则。

expr :- INT | ID;
array_expr :- array_expr expr | expr;
array :- '[' array_expr ']';

我玩 Bison 已经有一段时间了,但这应该非常接近正确。

【讨论】:

  • 我已经有一段时间没有构建 LR(1) 语法了,但出于某种原因,我认为 array_expr :- epsilon | array_expr expr 更好。这既允许空数组,而且找出遵循哪个规则的逻辑可能更容易:但自从我上次这样做已经十年了!
  • 哦,epsilon 是“匹配空字符串”标记的传统名称。不知道如何在Bisonese 中表达。
  • @Yakk:在bison 中,epsilon 只是一个空的令牌列表(即空格),但传统上将其写为/* empty */,这对人类来说更明显。一般来说,如果你确实使用了 epsilon 规则,你可以通过使用右递归而不是左递归来避免很多麻烦,但在这种情况下,expr 明确地以令牌开头,所以没有问题。跨度>
  • 非常感谢,这行得通!可能你甚至知道如何获取元素?我知道第一个元素是 1 美元,第二个是 2 美元,等等,但是有没有可能弄清楚我们有多少元素以及它们是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2013-10-24
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多