Flex Bison解析通用类型签名

时间:2016-07-08 15:12:23

标签: bison flex-lexer

我是Flex / Bison的新手。我正在尝试为支持泛型类型的简单编程语言编写解析器。

我想解析这样的一行:

fn foo(Vector<Pair<int, Array<T>>) -> void {}

我可以想象如何为Vector<Pair<int, Array<T>>编写一个手工制作的解析器。我只是跟踪&lt;的数量。我遇到并匹配&gt;的数量我遇到以确定类型规范是否完整。

对于类型,我相信语法规范是这样的吗?

TYPE : ID | ID '<' TYPE '>'
     ;

我不确定TYPE是否是由Flex或Bison生成的令牌。

我的理解是:

  • ID是来自Parser(Flex)的令牌
  • TYPE是一个'Term&#39; (不是令牌)在Bison中定义。
  • Flex和Bison会自动忽略空格和标签。

我是朝着正确的方向前进的吗?

注意:此项目仅用于我的教育目的。不是家庭作业等。

1 个答案:

答案 0 :(得分:0)

您的方向正确,但学习一些正确的术语很有用。了解术语将有助于您理解和使用包含更多有用信息的教科书。

在规则TYPE中,名称ID将被称为终端符号,而TYPE将被称为非终端< / em> 语法的符号语法是用于描述语言的一组规则。每个语法规则定义非终端符号。最终,每个非终端将被描述为终端符号在唯一(非模糊)排列中的排列。

终端符号由标记表示,代表其具体表示。具体表示是键盘上实际输入的内容。构成具体表示的字符序列称为 lexeme lexemes 的匹配以创建标记是由词法分析器(或 scanner )执行的任务。令牌序列与语法规则中非终端的匹配称为解析

Flex是生成词法分析器的工具,而bison是生成解析器的工具。

因此,TYPE不是令牌而是非终端符号(否则称为语法规则名称)。它不是由flex或bison“产生”,而是由语法的作者。 bison生成的解析器终端非终端的序列减少到名为{的非终端 {1}}。

为避免令牌终端非终端规则之间存在混淆,有一个不成文的约定令牌终端符号以CAPS或字符常量编写。例如:

TYPE

非终端语法规则以小写字母书写,以避免与前者混淆。例如:

ID, '<'

因此,一位经验丰富的野牛用户可能写道:

type, expression

这样每个名字的性质就更清晰了。

现在讨论空白。不,flex和bison不会忽略(自动或其他)空格,制表符,换行符,回车符和其他不可见字符,但它很复杂(就像你的问题一样)。

词法分析器处理的具体表示中出现了空白字符,并且在描述工具flex和bison的语言处理的规则集中出现了空白字符。您希望处理的语言可能包含语法上(甚至是语义上)重要的空白字符(极端的例子是名为WhiteSpace的语言)。可以使用flex和bison为该语言编写解析器,因此它不能忽略其输入描述文件或输入语言中的所有空格!不要在这里详述太多细节,值得注意的是,在某些地方,空白被忽略,而在其他地方则特别重要;直到一个人更有经验你应该小心。词法分析器规则文件中的空格比解析器规则文件更敏感。