语法分析

python ast 语法分析

痴心易碎 提交于 2019-11-28 23:45:44
ast(Abstract Syntax Trees)是python中非常有用的一个模块,我们可以通过分析python的抽象语法树来对python的代码进行 分析和修改 。 ast作用在python代码的语法被解析后,被编译成字节码之前。 一. ast 1. 获取语法树 ast模块的基本使用是非常简单的,我们可以通过如下代码快速得到一棵抽象语法树: import ast root_node = ast.parse("print 'hello world'") root_node -> <_ast.Module object at 0x9e3df6c> 通过ast的parse方法得到ast tree的根节点root_node, 我看可以通过根节点来遍历语法树,从而对python代码进行分析和修改。 ast.parse(可以直接查看ast模块的源代码)方法实际上是调用内置函数compile进行编译,如下所示: def parse(source, filename='<unknown>', mode='exec'): """ Parse the source into an AST node. Equivalent to compile(source, filename, mode, PyCF_ONLY_AST). """ return compile(source, filename,

递归下降语法分析程序

孤街醉人 提交于 2019-11-28 17:14:20
编译原理老师写的程序 递归下降语法分析程序举例 #include <stdio.h> #include<dos.h> #include<stdlib.h> #include<string.h> char a[50] ,b[50],d[200],e[10]; char ch; int n1,i1=0,flag=1,n=5; int total=0;/* 步骤计数器 */ int E(); int E1(); int T(); int G();/*E’*/ int S();/*T’*/ int F(); void input(); void input1(); void output(); void main() /* 递归分析 */ { int f,p,j=0; char x; d[0]='E'; d[1]='='; d[2]='>'; d[3]='T'; d[4]='G'; d[5]='#'; printf(" 请输入字符串 ( 长度 <50, 以 # 号结束) \n"); do{ scanf("%c",&ch); a[j]=ch; j++; }while(ch!='#'); n1=j; ch=b[0]=a[0]; printf(" 步骤 \t 文法 \t 分析串 \t\t 分析字符 \t 剩余串 \n"); f=E1(); if (f==0) return; if (ch=='#

递归下降语法分析

一个人想着一个人 提交于 2019-11-28 17:14:12
#include<stdio.h> #include<string.h> char str[10]; int index=0; void E(); //E->TX; void X(); //X->+TX|-TX| e void T(); //T->FY void Y(); //Y->*FY |/fy| e void F(); //F->(E) | id int id(); //id int main() { int len; int m; printf("请输入算数表达式:"); scanf("%s",str); len=strlen(str); str[len]='#'; str[len+1]='\0'; E(); printf("正确语句!\n"); strcpy(str,""); index=0; return 0; } void E() { T(); X(); } void X() { if(str[index]=='+') { index++; T(); X(); } else if(str[index]=='-') { index++; T(); X(); } } void T() { F(); Y(); } void Y() { if(str[index]=='*') { index++; F(); Y(); } else if(str[index]=='/') {

递归下降语法分析

这一生的挚爱 提交于 2019-11-28 17:13:53
1 # include <stdio.h> 2 # include <string.h> 3 # include <stdlib.h> 4 int E(); 5 int G(); 6 int T(); 7 int Ss(); 8 int F(); 9 char a[52]; 10 int total=0; 11 int i=0; 12 int temp=1; 13 int main() 14 { 15 gets(a); 16 int f; 17 18 f=E(); 19 if(f==0) 20 return 0; 21 if(a[i] == '#') 22 printf("accept\n"); 23 else 24 { 25 printf("error\n"); 26 return 0; 27 } 28 } 29 int E() 30 { 31 int f,t; 32 printf("%d E-->TG\n",total++); 33 f=T(); 34 if(!f) 35 return 0; 36 t=G(); 37 if(!t) 38 return 0; 39 else 40 return 1; 41 42 } 43 int G() 44 { 45 int f,t; 46 if(a[i] == '+') 47 { 48 i++; 49 printf("%d G-->+TG\n

递归下降语法分析

北战南征 提交于 2019-11-28 17:13:32
对于给定的文法G[E] : E→E+T|E-T|T T→T*F| T/F|F F→(E)|i 消除左递归后的文法是: E→TE' E'→+TE'|-TE'|∑ T→FT' T'→*FT'|/FT'|∑ F→(E)|i 是否是LL(1)文法? select(E→TE')=first(TE')={(,i} select(E'→+TE')=first(+TE')={+} select(E'→-TE')=first(-TE')={-} select(E'→∑)=follow(E')={),#} select(T→FT')=first(FT')={(,i} select(T'→*FT')=first(*FT')={*} select(T'→/FT')=first(/FT')={/} select(T'→∑)=follow(T')={+,-,),#) select(F→(E))=first((E))={(} select(F→i)=first(i)={i} 由上分析,得知此文法满足LL(1)文法 #include<stdio.h> void E(); void T(); void E1(); void T1(); void F(); char s[100]; int i, SIGN; int main() { printf("请输入一个语句,以#号结束语句(直接输入#号推出)\n");

实验四、递归下降语法分析实验

有些话、适合烂在心里 提交于 2019-11-28 17:13:14
实验目的 ( 1 )掌握自上而下语法分析的要求与特点。 ( 2 )掌握递归下降语法分析的基本原理和方法。 ( 3 )掌握相应数据结构的设计方法。 实验内容和要求 编程实现给定算术表达式的递归下降分析器。 算术表达式文法如下: E-->E+T|T T-->T*F|F F-->(E)|i 实验方法、步骤及结果测试 原理分析及流程图 ( 1 )当遇到终结符 a 时,则编写语句 If( 当前读到的输入符号 ==a) 读入下一个输入符号 ( 2 )当遇到非终结符 A 时,则编写语句调用 A() 。 ( 3 )当遇到 A-->ε 规则时,则编写语句 If( 当前读到的输入符号不属于 Follow(A))error() ( 4 )当某个非终结符的规则有多个候选式时,按 LL(1) 文法的条件能唯一地选择一个候选式进行推导 . 主要 程序段及其解释: #include<stdio.h> void E(); void T(); void E1(); void T1(); void F(); char s[100]; int i, SIGN; int main() { printf(" 请输入一个语句 , 以 # 号结束语句 ( 直接输入 # 号推出 ) \n"); while( 1 ) { SIGN = 0; i=0; scanf("%s",&s); if( s[0] == '#') return

从零写一个编译器(二):语法分析之前置知识

冷暖自知 提交于 2019-11-27 15:00:06
前言 在之前完成了词法分析之后,得到了Token流,那么接下来就是实现语法分析器来输入Token流得到抽象语法树 (Abstract Syntax Tree,AST) 。但是在完成这个语法分析器不像词法分析器,直接手撸就好了,还是需要一些前置的知识。 这些前置知识在之前的博文都有提起过 之前的博文目录 项目的完整代码在 C2j-Compiler 什么是语法分析? 如果我们把词法分析看成是组合单词,输出单词流,那么语法分析就可以看作是检查这些单词是不是符合语法的过程。在词法分析的时候用正则或者手工比对来验证单词,语法分析则是用上下文无关文法 (context-free grammar,CFG) 。 若一个形式文法 G = (N, Σ, P, S) 的产生式规则都取如下的形式:V -> w,则谓之。其中 V∈N ,w∈(N∪Σ) 。上下文无关文法取名为“上下文无关”的原因就是因为字符 V 总可以被字符串 w 自由替换,而无需考虑字符 V 出现的上下文。一个形式语言是上下文无关的,如果它是由上下文无关文法生成的* BNF范式 巴科斯范式(英语:Backus Normal Form,BNF)是一种用于表示上下文无关文法的语言。 看一个例子: S –> AB A –> aA | ε B –> b | bB 其中S A B叫作 非终结符 ,代表可以通过推导产生新的符号

lucene入门&Solr

自闭症网瘾萝莉.ら 提交于 2019-11-26 14:53:33
LUCENE 1. 学习计划 1、案例分析:什么是全文检索,如何实现全文检索 2、Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3、配置开发环境 4、创建索引库 5、查询索引库 6、分析器的分析过程 a) 测试分析器的分词效果 b) 第三方中文分析器 7、索引库的维护 a) 添加文档 b) 删除文档 c) 修改文档 8、Lucene的高级查询Lucene的查询 a) 使用Query的子类查询 MatchAllDocsQuery TermQuery NumericRangeQuery BooleanQuery b) 使用QueryParser QueryParser MulitFieldQueryParser 2. 案例 实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来。还可以根据中文词语进行查询,并且需要支持多个条件查询。 本案例中的原始内容就是磁盘上的文件,如下图: 3. 需求分析 3.1. 数据库搜索 数据库中的搜索很容易实现,通常都是使用sql语句进行查询,而且能很快的得到查询结果。 为什么数据库搜索很容易? 因为数据库中的数据存储是有规律的,有行有列而且数据格式、数据长度都是固定的。 3.2. 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库

实验二 递归下降语法分析

丶灬走出姿态 提交于 2019-11-26 12:00:30
老师: MissDu  提交作业 一、实验目的: 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验原理 每个非终结符都对应一个子程序。 该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端: 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理 每遇到一个非终结符,则调用相应的子程序 三、实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。 例如: 输入begin a:=9;x:=2*3;b:=a+x end # 输出success 输入x:=a+b*c end # 输出‘end' error 四、实验步骤 1.待分析的语言的语法(参考P90) 2.将其改为文法表示,至少包含 –语句 –条件 –表达式 3. 消除其左递归 4. 提取公共左因子 5. SELECT集计算 6. LL(1)文法判断 7. 递归下降分析程序 #include<iostream> #include<stdio.h> #include<string> using namespace std;

Lucene介绍与入门使用

跟風遠走 提交于 2019-11-26 03:14:12
Lucene介绍与入门使用   Lucene简介   Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。   那么先来说一说什么是全文搜索   说之前先说一说 数据的分类 :      我们生活中的数据总体分为两种:结构化数据和非结构化数据。     (1) 结构化数据 :指具有固定格式或有限长度的数据,如数据库,元数据等。     (2) 非结构化数据 :指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件   结构化数据查询方法   数据库搜索