如何根据正则表达式构建语法分析树

作者&投稿:干蕊 (若有异议请与网页底部的电邮联系)
怎么用正则表达式表示括号的嵌套?比如:((())())~

正则表达式不适合处理这种带堆栈性质或者树性质的表达式,不过.net有平衡组可以模拟实现,如果你在处理像表达式一样的东西,我建议你写专用的词法语法分析器,会比较好

正规式转NFA我也没做过
大概想了一下
首先是要识别正规式吧
可以用LR分析法把正规式识别成一颗语法树
比如(a*|b)·c识别成语法树就是
* ·
* / \
* | c
* / \
* * b
* /
* a
(如果省略了·,为了方便,还是在语法树里生成·)
然后后序递归遍历这个语法树,当然,在这之前需要写好有向图的结构,好保存NFA
如果递归函数碰到a,就创建两个节点,比如节点1和2,然后创建一条边,由1指向2,边的属性设为a
然后返回这两个节点的地址
如果递归函数碰到|,因为是后序遍历,所以此时应该已得到了遍历左右孩子得到的4个节点,比如节点1,2,3,4
这时再创建两个节点,比如节点5,6
然后这样连接:
* 1------2
* / \
*5 6
* \ /
* 3------4
然后返回5,6节点
至于碰到*和·,也是类似的操作,就按书上的方法来吧
这样,全后序遍历一遍语法树了之后,NFA就转化好了,并且得到开始节点和终止节点
PS1:
正规式的识别文法我试着写了一下,不一定对......
S->A
A->A|B
A->B
B->BC
B->B·C
B->C
C->D*
D->(S)
D->l
D->ε(ε也是一个字符)
l是字母
支持(a|b|c)d,(abc)d,(a)(b)(c),((a*)*)*,但不支持a***
优先级由高到低是*,·,|
对于a·b|c和ab|c,相当于(ab)|c
对于abc*,相当于ab(c*)
·和|都是左结合
PS2:
如果LZ觉得LR分析法的语义规则写起来太烦的话可以试试算符优先分析法
用LL(1)递归下降分析法也可以,只不过·和|都要改成右结合,消除左递归,反正正规式的左结合和右结合语义是一样的
这里有一个LL(1)分析中缀表达式的例子,你可以参考一下
http://zhidao.baidu.com/question/326922407.html?oldq=1

如果给出短语等名词的形式化的定义,便较难理解,不好求。我们通过构造语法树来求解。首先你应该会根据文法将所给句型构造成语法树的形式,即根据文法怎样推导出句型E+T*F。如果你有数据结构二叉树基础的话这很简单就构造出来了。构造出语法树后,求短语看根节点,有T,和E。则短语为:E+T*F,T*F,而直接短语是指能直接推出叶子节点的根所对应的短语,可知该节点为T,直接短语为:T*F。句柄是最左直接短语,可知为:T*F。


深入研究查询Elasticsearch,过滤查询和全文搜索
根据分析器的配置方式,这会影响您的搜索功能,因为分析器也适用于全文搜索。 分析器管道包括三个阶段: 总有一个令牌生成器和零个或多个字符和令牌过滤器。 1)字符过滤器按原样接收文本数据,然后可能在对数据进行标记之前对其进行预处理。 字符过滤器用于: · 替换与给定正则表达式匹配的字符 · 替换与给定字符串...

杀毒软件的工作原理是什么
扫描器中的通配符一般用于跳过某些字节或字节范围,以至于现在有些扫描器还支持正则表达式!下面我们通过一个例子来讲解通配符扫描技术的原理。例如我们的病毒库中有这样一段特征码:0400 B801 020E 07BB ??02 %3 33C9 8BD1 419C上面的特征码可以解释为:1、尝试匹配04,如果找到则继续,否则跳出。2、尝试上一匹配...

精通Python网络爬虫之网络爬虫学习路线
3、深入掌握一款合适的表达式 学会了如何爬取网页内容之后,你还需要学会进行信息的提取。事实上,信息的提取你可以通过表达式进行实现,同样,有很多表达式可以供你选择使用,常见的有正则表达式、XPath表达式、BeautifulSoup等,这些表达式你没有必要都精通,同样,精通1-2个,其他的掌握即可,在此建议精通掌握...

java学习作为一名java初学者,如何快速学习j
想要快速学习Java建议去【达内教育】学习,该机构26大课程体系紧跟企业需求,企业级项目,课程穿插大厂真实项目讲解,对标企业人才标准,制定专业学习计划,囊括主流热点技术。JAVA快速入门的方法:1、时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java。2、在学习的过程中,...

制作带章节目录的mobi电子书(Kindle打开)
在Sublime Text 3中,我调用正则表达式功能,输入“^(\\s+|)第(.*)章”,这个表达式巧妙地识别出章节标题,然后替换为“###第\\2章”。通过这个步骤,每个标题都变成了可导航的章节,目录功能得以在Kindle阅读器上完美呈现。接下来,我将整理好的TXT文件导入Calibre,关键设置是确保目录的链接功能。在...

ActionScript版本对比
正则表达式 ActionScript 3.0 包括对正则表达式的固有支持,因此您可以快速搜索并操作字符串。由于在 ECMAScript (ECMA-262) 第 3 版语言规范中对正则表达式进行了定义,因此 ActionScript 3.0 实现了对正则表达式的支持。命名空间 命名空间与用于控制声明(public、private、protected)的可见性的传统访问...

信息技术作业!~
在大量使用正则表达式的小型项目,它逊于Perl。对于微型项目而言,shell和Tcl可能更好,Python显得太过强大了。 总结:Python最出色的地方在于,它鼓励清晰易读的代码,特别适合以渐进开发的方式构造大项目。其缺陷在于效率不高,太慢,不但跟编译语言相比慢,就是跟其他脚本语言相比也显得慢。 已赞过 已踩过< 你对这个...

自学自动化测试的条件和方法
首先,想从事自动化测试,必须先了解What\/Why\/How,也就是常说的去了解什么是自动化测试、为什么要进行自动化测试、该如何进行自动化测试,这类的资料在网上有很多,这里就不做重复了; 其次,需要根据项目的特点,选择合适的自动化测试工具,并了解工具的特性。以QTP为例,该如何去掌握它呢?对于初学者...

redis 默认启动多少个端口
文件中读取表达式,忽略其它的表达式;-i指定监听的网络接口;-r从指定的文件中读取包(这些包一般通过-w选项产生);-w直接将包写入文件中,并不分析和打印出来;-T将监听到的包直接解释为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议;)2.tcpdump的表达式介绍表达式是一个正则表达式,tcpdump...

飞扬的公司名称
其它类库在逐步完善中:用户界面,工具,反射,多线程,正则表达式,编码转换,XML……集成开发环境(IDE)全力开发中……要了解更多研发进展,请随时关注“易语言.飞扬”大连大有吴涛易语言软件开发有限公司,2007.7 1 “易语言.飞扬”是什么?“易语言.飞扬”是一门简单易学、高效实用、面向对象、跨平台的计算机通用编程语言。

泊头市15731924116: 如何求语法分析树
御劳复方: 如果给出短语等名词的形式化的定义,便较难理解,不好求.我们通过构造语法树来求解.首先你应该会根据文法将所给句型构造成语法树的形式,即根据文法怎样推导出句型E+T*F.如果你有数据结构二叉树基础的话这很简单就构造出来了.构造出语法树后,求短语看根节点,有T,和E.则短语为:E+T*F,T*F,而直接短语是指能直接推出叶子节点的根所对应的短语,可知该节点为T,直接短语为:T*F.句柄是最左直接短语,可知为:T*F.

泊头市15731924116: 如何由文法推导语法树?(编译原理)
御劳复方: 语法树,是针对上下文无关文法,用来表示一个句型的生成过程的一种描述手段. 对于给定的句型,依据文法构造它的语法树,是语法分析的任务. 编译原理课程中重点学习的各种语法分析方法,都是解决语法树的构造的具体分析方法. 在学习并掌握各种语法分析方法之前,一般只能依据直觉印象,通过猜测、拼凑等手段,去试着推演,凑出符合要求的句型的语法树.所以这个阶段练习用的题目一般也不很复杂,通过多多练习也能找到一些技巧(其实主要是后面将要学习的自顶向下语法分析中的一些原则). 对于给定的文法,有一些句型可能能构建出两棵甚至多棵结构不同的语法树,结果不一定是唯一的.这样的文法就是所谓的二义性文法. 对于非二义性文法而言,任意一个句型的语法树都是唯一的.

泊头市15731924116: 如何用python写一个解释器 -
御劳复方: 大学里计算机科学最吸引我的地方就是编译器.最神奇的是,编译器是如何读出我写的那些烂代码,并且还能生成那么复杂的程序.当我终于选了一门编译方面的课程时,我发现这个过程比我想的要简单得多.在本系列的文章中,我会试着通过...

泊头市15731924116: 什么是语法制导翻译 -
御劳复方: 语法制导翻译,简称SDD.基于属性文法的处理过程,对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算. 翻译的任务:首先是语义分析和正确性检查,若正确,则翻译成中间代码或目标代码. 使用的方法称作语法制导翻译.基本思想是,根据翻译的需要设置文法符号的属性,以描述语法结构的语义.例如,一个变量的属性有类型,层次,存储地址等.表达式的属性有类型,值等.属性值的计算和产生式相联系.随着语法分析的进行,执行属性值的计算,完成语义分析和翻译的任务.

泊头市15731924116: 抽象语法树的结构 -
御劳复方: 抽象语法树的结构不依赖于源语言的文法,也就是语法分析阶段所采用的上下文无关文法.因为在Parser工程中,经常会对文法进行等价的转换(消除左递归、回溯、二义性等),这样会给文法引入一些多余的成分,对后续阶段造成不利影响,甚至会使各阶段变得混乱.因此,很多编译器(包括GJC)经常要独立地构造语法分析树,为前、后端建立一个清晰的接口.下图是hello.java中的“hello world“程序的AST示例:

泊头市15731924116: 语法制导翻译
御劳复方: 第五章 语法制导翻译 5.1 计算语义规则的方法 1 .分析树法: 输入串----分析树----依赖图----计算次序 2. 基于规则的方法: 在构造编译器时,用手工或专门的工具来分析语义规则,确定属性值的计算顺序. 3. 忽略语义规则的方法:在分析过程中...

泊头市15731924116: 编译原理语法分析的实验.要语法树 -
御劳复方: #include #include #include #include using namespace std; struct Node1 { char vn; char vt; char s[10]; }MAP[20];//存储分析预测表每个位置对应的终结符,非终结符,产生式 int k;//用R代表E',W代表T',e代表空 char G[10][10]={"E->TR","R->+...

泊头市15731924116: 怎样从c++源程序中提取抽象语法树 csdn -
御劳复方: 在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码.树上的每个节点都表示源代码中的一种结构.之所以说语法是“抽象”...

泊头市15731924116: 编译原理实现判断是不是一个文法的句子 -
御劳复方: 构造LL(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子.程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网