【问题标题】:Flex Bison parsing of a Generic type signature泛型类型签名的 Flex Bison 解析
【发布时间】:2016-07-08 15:12:22
【问题描述】:

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

我想解析这样的一行:

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

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

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

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

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

我的理解是:

  • ID 是来自 Parser (Flex) 的令牌
  • TYPE 是 Bison 中定义的“Term”(不是 Token)。
  • Flex 和 Bison 会自动忽略空格和制表符。

我的方向正确吗?

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

【问题讨论】:

    标签: bison flex-lexer


    【解决方案1】:

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

    在规则TYPE 中,名称ID 将被称为终端 符号,而TYPE 将被称为非终端 符号语法语法 是用于描述语言的一组规则。每个语法规则都定义了一个 非终结符 符号。最终,每个非终结符都将被描述为终结符符号以唯一(非模棱两可)的排列方式排列。

    终端 符号由token 表示,它代表它的具体表示。具体表示是在键盘上实际键入的内容。构成具体表示的字符序列称为词位词素的匹配以创建tokens词法分析器(或扫描器)执行的任务。标记序列与语法规则中的非终结符的匹配称为解析

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

    所以,TYPE 不是一个记号,而是一个非终结符(或者称为语法规则名称)。它不是由 flex 或 bison “产生”的,而是由语法的作者“产生”的。 bison 生成的解析器会将终端非终端的序列减少到称为@的非终端 987654327@.

    为了避免 tokensterminalsnon-terminalsrules 之间的混淆,有一个不成文的约定: tokensterminal 符号用大写字母或字符常量书写。例如:

    ID, '<'
    

    非终结符语法规则都写成小写以避免与前者混淆。例如:

    type, expression
    

    所以,有经验的野牛用户可能会这样写:

    type_signature : ID 
         | ID '<' type_signature '>'
         ;
    

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

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

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

    【讨论】:

    • 感谢您的详细回答。是否有关于良好开发人员最佳实践的良好文档。我看到的所有教程都是关于直接从操作块打印语句或执行解释器等等。另外,我们如何编写上下文相关的操作代码。有什么最佳实践吗?示例:如果这是在 Function 声明的上下文中,则将 Type 对象添加到 Arg 类型列表中。如果它在函数返回类型的上下文中,则将此类型设置为函数声明的返回类型等等。
    • @user855 - 试试这个答案:stackoverflow.com/questions/37186142/…
    猜你喜欢
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多