我是Flex / Bison的新手。我正在尝试为支持泛型类型的简单编程语言编写解析器。
我想解析这样的一行:
fn foo(Vector<Pair<int, Array<T>>) -> void {}
我可以想象如何为Vector<Pair<int, Array<T>>
编写一个手工制作的解析器。我只是跟踪&lt;的数量。我遇到并匹配&gt;的数量我遇到以确定类型规范是否完整。
对于类型,我相信语法规范是这样的吗?
TYPE : ID | ID '<' TYPE '>'
;
我不确定TYPE是否是由Flex或Bison生成的令牌。
我的理解是:
我是朝着正确的方向前进的吗?
注意:此项目仅用于我的教育目的。不是家庭作业等。
答案 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为该语言编写解析器,因此它不能忽略其输入描述文件或输入语言中的所有空格!不要在这里详述太多细节,值得注意的是,在某些地方,空白被忽略,而在其他地方则特别重要;直到一个人更有经验你应该小心。词法分析器规则文件中的空格比解析器规则文件更敏感。