本发明专利技术涉及LR(k)文法任意文法位置的断点调试方法,其步骤是:定义语言的LR(k)文法或LR(k)文法的子类文法G;在相应的文法位置插入断点;检查每一断点,若该断点设置在产生式右部中间的某个文法位置,则添加无用非终结符号,从而得到新的文法G’;为文法G’生成分析表;计算每个断点的类型;分析输入串,直至遇到一个归约动作,检查该归约动作处是否对应一个断点,如是则采取如下动作:对有效断点,暂停分析过程,显示当前的分析状态信息;对无效断点,忽略该断点,继续分析过程;对不确定断点,则忽略或结合当前的输入串和断点设置位置,进一步判断该位置是否有效,如果对于当前的输入串,该位置是有效的,则按有效断点位置处理,如果该位置是无效的,则忽略该位置,继续分析过程。本发明专利技术显著增加可跟踪和调试的断点数目,可以跟踪到更细粒度的语法成分,帮助用户更好地进行文法调试,降低分析器的开发难度。
【技术实现步骤摘要】
本专利技术涉及文法的断点调试技术,提出了一种LR(k)文法任意文法位置的断点调试方 法,它可显著增加可跟踪和调试的断点数目,帮助用户更好地进行文法调试。
技术介绍
分析器生成器(parser generator)在分析器(parser)和编译前端(compiler front end)构造中得到了广泛应用,越来越多的开发者使用分析器自动生成工具来生成分析器或编译前端。 与编译领域的专家不同,这些普通开发者往往对分析理论并不熟悉,而且他们也不是经常 开发此类分析工具。对于这类开发者而言,良好的文法调试支持是不可或缺的,可以有效 降低分析器开发的复杂性,提高开发效率。即使对编译领域的专家而言,良好的文法调试 支持也可以帮助他们更快更好地开发分析器。对于LL(k)文法, 一些经典的源码调试工具, 比如GNU的gbd调试器、微软的Visual C4"+调试器等,可以用来展示LL分析方法采用 的递归下降分析器(recursive descent parser)的分析过程,这是因为LL文法和它对应的递归 下降分析器之间有很明显的结构对应关系,借助这些经典的源码调试工具,开发者就可以 对分析过程有较好的理解。然而,LR(k)文法却无法利用这些经典的源码调试工具,主要 原因在于LR(k)采用的是自底向上的分析方法,LR(k)文法和其对应的分析器之间并无结 构上的对应关系。为流行的程序设计语言,如C+十、Ada等开发LR0O分析器,需要非常 专业的知识和技能,只有很少的开发者可以开发此类分析器。LR(k)文法是支持确定性分 析的最大文法类,LR(k)文法及其子类在各类分析器生成器(parser generator)中有广泛应 用。相比于LL(k)文法,LR(k)文法所能描述的文法范围要宽泛得多,可以表示当今大多 数编程语言的文法,可以处理左递归,应用非常广泛,因此,迫切需要良好的LR(k)文法 调试技术支持。软件可视化(Software visualization ,简称SV),是一种利用图形手段增强用户对程序 理解的技术。目前已出现了一些基于SV、采用自底向上分析方法的分析器生成器,如 J7racc, 77, F/^fl/ /^"++,丄/w,;, ^朋Gra/n等。这些工具可以展示LR(k)分析器使用的确 定性下推自动机(deterministic pushdown automaton)的分析过程,如符号^(symbo1 stack), 语法树(syntaxtree),当前使用的产生式(production)及向前看符号(lookahead)等,可以帮助 用户较好地理解分析过程。断点是一种经典直观的调试支持手段,广泛应用于各类基于SV技术的调试器 (debugger)中。或许断点调试是目前最为人们熟悉的调试方式了。目前采用的LR(k)文法 的断点调试技术存在一个不足,即只允许在产生式右部末尾设置断点,不允许在产生式右 部的中间位置设置断点。比如,对于图l所示文法,传统的断点调试方法只允许在图中粗 黑点标注的位置设置断点,不允许在其它位置设置断点。这是LR(k)分析方法的一个固有 属性,因为标准的LR(k)分析方法不支持产生式内部的语义动作调用,无法暂停分析过程 以查看分析状态信息。只允许在产生式右部末尾而不允许在产生式右部的其它位置设置断点,给用户的调试 带来了不便。比如,对于图l中的Rulel,如果想在分析器识别了 "+"后查看分析器的 分析状态,目前的LR(k)文法调试技术却并不支持,因为不允许在"+"之后设置一个断点,除非用户手工在"+"之后添加了一个新的无用非终结符号(millnontermhml)X,如图 2所示,并且在新增加的产生式的末尾设置一个断点(Rule3)。由用户手工添加无用非终结符会带来一系列的弊端。首先,这种方式修改了原始文法损害了文法的可读性;其次,给用户增加了额外的处理负担;第三,这些无用非终结符本 质上并不是原始文法的一部分,因此在调试完毕后,它们必须从文法中删除,这样,用户 每次设置一个断点,都要手工添加一个无用非终结符,当调试完毕又不得不删除,这给用 户的调试带来了很大的不便;最后,在LR(k)文法中添加无用非终结符可能会引入新的分 析冲突,造成更改后的文法不再是LR(k)文法,从而导致分析过程失败。比如,图l所示文 法是一个LR(k)文法,如果在Ruel的右边开始位置添加一个无用非终结符,将导致更改 后的文法不再是LR(k)文法(图3),
技术实现思路
有鉴于此,本专利技术的目的是提出一种新的断点调试方法,该方法可显著增加可跟踪和 调试的断点数目,从而可以跟踪到更细粒度的语法成分。 为此,本专利技术采用以下技术方案一种,它包括如下步骤 定义语言的LR(k)文法或者LR(k)文法的子类文法G; 用户在相应的文法位置插入断点;检査用户设置的每一个断点,如果该断点设置在某个产生式右部末尾,则什么都不做, 如果该断点设置在产生式右部中间的某个文法位置,则自动添加相应的无用非终结符号, 从而得到一个新的文法G';为新的文法G'生成分析表;计算每个断点的类型,从而得到每个断点是有效断点、无效断点,还是不确定断点; 利用LR(k)分析方法或者其子类分析方法分析输入串,直到遇到一个归约动作,检查 该归约动作处是否对应一个断点,如果对应一个断点,则根据不同的断点类型采取如下动 作如果是一个有效断点,则暂停分析过程,显示当前的分析状态信息;如果是一个无效 断点,则忽略该断点,继续分析过程;如果是一个不确定断点,则采用以下两种方法之一 一种方法是简单忽略这些不确定断点,继续分析过程;另一种方法是结合当前的输入串和 断点设置位置,进一步判断该位置是否有效,如果对于当前的输入串,该位置是有效的, 则按照有效断点位置处理,如果对于当前输入串,该位置是无效的,则忽略该位置,继续 分析过程。本专利技术方法的优点在于支持在产生式右部任意文法位置插入断点,可显著增加可跟 踪和调试的断点数目,从而可以跟踪到更细粒度的语法成分:本专利技术方法对用户完全透明, 不会给用户增加任何处理负担,用户用起来简单直观;本方法很容易集成到现有的分析器 生成框架中;本专利技术可帮助用户更好地进行文法调试,可在一定程度上降低分析器的开发 难度。其中的断点类型分类算法可以区分不同的断点类型,可以更好的指导分析过程,同 时又不会引入任何新的分析冲突。附图说明图1表示一个LR(l)文法;图2表示添加一个无用非终结符到图1所示文法; 图3表示增加无用非终结符给文法引入了新的冲突; 图4表示在产生式右部的中间位置中间插入一个断点; 图5表示一个文法的文法位置;图6表示一个支持加法和乘法的算术表达式文法;图7表示图6所示文法的初始结点的一个部分状态位置图;图8表示一个示例文法G;图9表示图8所示文法的初始状态对应的两个PSPG;图10表示合并图9中的两个pspg中的相同结点得到的spg; 图11表示一个状态数随n增大呈指数规模增长的LR(k)文法。具体实施方式本专利技术提出了一种新颖的LR(k)文法断点调试方法,它支持在产生式右部任意文法位 置(grammar position)插入断点。比如,对于上面讨论的问题,如果用户想要在识别"十" 后查看分析状态信息,我们本文档来自技高网...
【技术保护点】
一种LR(k)文法任意文法位置的断点调试方法,其特征在于它包括如下步骤:(1.1)定义语言的LR(k)文法或者LR(k)文法的子类文法G;(1.2)用户在相应的文法位置插入断点;(1.3)检查用户设置的每一个断点,如 果该断点设置在某个产生式右部末尾,则什么都不做,如果该断点设置在产生式右部中间的某个文法位置,则自动添加相应的无用非终结符号,从而得到一个新的文法G’;(1.4)为新的文法G’生成分析表;(1.5)计算每个断点的类型,从而可 以得到每个断点是有效断点、无效断点,还是不确定断点;(1.6)利用LR(k)分析方法或者其子类分析方法分析输入串,直到遇到一个归约动作,检查该归约动作处是否对应一个断点,如果对应一个断点,则根据不同的断点类型采取如下动作:( 1.6.1)如果是一个有效断点,则暂停分析过程,显示当前的分析状态信息;(1.6.2)如果是一个无效断点,则忽略该断点,继续分析过程;(1.6.3)如果是一个不确定断点,则采用以下两种方法之一:一种方法是简单忽略这些不确定断 点,继续分析过程;另一种方法是结合当前的输入串和断点设置位置,进一步判断该位置是否有效,如果对于当前的输入串,该位置是有效的,则按照有效断点位置处理,如果对于当前输入串,该位置是无效的,则忽略该位置,继续分析过程。...
【技术特征摘要】
【专利技术属性】
技术研发人员:许福,李虎,金茂忠,刘超,
申请(专利权)人:北京航空航天大学,
类型:发明
国别省市:11[中国|北京]
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。