Page 135 - 《软件学报》2025年第8期
P. 135

3558                                                       软件学报  2025  年第  36  卷第  8  期


                    本文的研究对象是       Lustre 语言的  V6  版本, 参考资料主要为     Lustre V6  官网公开的官方文档和文法文档. 其中
                 文法文档给出了      Lustre V6  完整的上下文无关文法, 文法形式如图         4  所示. 为了能够使用该文法, 首先需要对它进
                 行标准化, 主要工作有      3  点: 消除化简  EBNF  范式、消除文法左递归、格式化符号.























                                                   图 4 Lustre V6  语法规则

                    扩展巴科斯-瑙尔范式        (extended Backus-Naur form, EBNF) 是一种主要用于描述上下文无关语法的元语法符
                 号表示法. 相较于常见的产生式表示方法, EBNF             范式定义了许多助记符. 助记符能简化产生式, 便于书写、阅读
                 和理解, 但是在识别算法中支持助记符会极大增加开发的难度和工作量. 考虑到扩展性, 其他语言的上下文无关文
                 法表示并不一定采用        EBNF  范式表达, 即使同为     EBNF  范式, 表达方式也可能略有不同         (Lustre V6 官方文档中的
                 定义方式就和     ISO/IEC 14977  中定义的  EBNF  范式不同). 权衡之下, 本文选择手动将        EBNF  范式中的助记符化简,
                 得到没有助记符的上下文无关文法版本. 并且为了防止在之后下推自动机识别的过程中产生无限循环, 需要消除
                 左递归. 最后, 为了便于识别程序区分产生式中的终结符和非终结符, 将终结符书写为小写字母开头的字符串, 将
                 非终结符书写为大写字母开头的字符串, 如表              1  所示.

                                                表 1 标准化前后的文法产生式

                                    Lustre 产生式                     标准化后的Lustre 产生式
                                                          TypedLv6IdsList → TypedLv6Ids TypedLv6IdsList1
                              TypedLv6IdsList::=          TypedLv6IdsList1 → ; TypedLv6Ids TypedLv6IdsList1
                              TypedLv6Ids {; TypedLv6Ids}
                                                                         → $
                                                          TypedLv6Ids → Lv6Id TypedLv6Ids1 : Type
                              TypedLv6Ids::=              TypedLv6Ids1 → , Lv6Id TypedLv6Ids1
                              Lv6Id {, Lv6Id} : Type
                                                                      → $

                    文法标准化后, 可以输入到下推自动机生成模块自动生成下推自动机. 上文提到, 上下文无关文法和下推自动
                 机的表达能力是等价的, 每个上下文无关文法都对应一个下推自动机. 进一步的, 由于上下文无关文法的并仍然是
                 上下文无关文法, 所以下推自动机的并仍然是下推自动机. 所以, 由下推自动机生成模块生成的下推自动机可以识
                 别  Lustre V6  程序, 并且由多个上下文无关文法生成的下推自动机也可以合并为一个下推自动机. 因此, 既可以将
                 整个语言的上下文无关文法一次性转化成下推自动机, 也可以分别转换文法单元再合并为一个下推自动机. 生成
                 的下推自动机如表       2  所示, 其中箭头“→”左侧表示当前状态, 箭头“→”右侧由可能到达的状态列表组成, 列表中的
                 每个元素为一个三元组{Q, a, PUSH/POP e}, 代表在读入字符            a 时, 到达  Q  状态, 并在栈中压入    (PUSH) 或弹出
                 (POP) 元素  e.
   130   131   132   133   134   135   136   137   138   139   140