语法分析

关于flex/bison 语法分析的问题

你说的曾经没有我的故事 提交于 2019-12-09 13:32:46
关于flex/bison 语法分析的问题 在进行语法分析的时候,发现在flex词法分析中分析过的词传不过来,之后查了网上说要用yylval参数传值,但是我需要传的参数种类很多,于是我申明了一个union,并给YYSTYPE定义为这个union(YYSTPE是yylval的类型),但是发现报错如下: union中的类型没有找到,一直以为是编译器出了问题,但是查看bison生成的头文件发现了事实的真相。 bison中为了满足各个符号不同的语义值的类型可以定义 %union{ …… } 如图: 其中YYSTYPE的定义就来源于这个,而不能自己在flex文件中定义union,然后赋值给YYSTYPE 如果需要用到yylval直接引用头文件 #include "xxx.tab.h" 即可 件 #include "xxx.tab.h" 即可 来源: CSDN 作者: AnnaZhan 链接: https://blog.csdn.net/AnnaZhan/article/details/103456037

用C++编写简单绘图语言的语法分析器

喜夏-厌秋 提交于 2019-12-09 13:03:13
语法分析器 概述 从词法分析的角度看,语言是一个单词的集合,称之为正规集,单词是由一个个字符组成的线性结构;从语法分析的角度看,语言是一个句子的集合,而句子是由词法分析器返回的记号组成的非线性结构。反映句子结构的最好方法是树,常用的有分析树和语法树。分析语法结构的基本方法有两种: 自上而下 分析方法和 自下而上 分析方法。自上而下分析从根到叶子建立分析树,而自下而上分析恰好相反。在这两种情况下,分析器都是从左到右地扫描输入,每次读进一个记号。 与词法分析类似,语法分析也具有双重含义: ①规定句子形成的规则,也被称为语法规则。程序设计语言的大部分语法规则可以用上下文无关文法( Context Free Grammar , 简称 CFG )来描述。 ②根据语法规则识别记号流中的评议结构,也被称为语法分析。最有效的自上而下和自下而上的分析方法都只能处理上下文无关文法的子类,如 LL 文法和 LR 方法,但是它们已足以应付程序设计评议的绝大多数语法现象。 一、任务与目的 ·上机任务: 1 、使用 C/C++ 程序设计语言和递归下降子程序的方法编写该函数绘图语言的词法分析器。并要求设计一个语法分析器的测试小程序来调用自己编写的语法分析器测试各种不同的输入。 2 、语法分析的任务是在词法分析基础上,根据语言的语法规则,把词法符号分解成各类语法单位。语法分析所依据的是语言的语法规则

关于词法分析和语法分析

て烟熏妆下的殇ゞ 提交于 2019-12-07 18:59:28
最近,在看了《自己动手写编译器,链接器》之后,便打算按照书中的思路,来完成一个sc语言的编译器scc。由于我对scala较为熟悉,所以自此开始着手进行lexer和parser的编写。 抛弃那些专业术语,从业余的角度来讲,要完成对源码的解析和分割,着色和打印,需要解决以下几个问题。 1. 按字节读取源码,能够提前读取下一个或者多个字节内容然后回退到未读的状态。 在java中已经有现成的工具类PushBackInputStream,能够在尝试读取多个字节内容后回退到未读状态。 2. 空格和换行的处理。 由于sc语言以括号和分号结尾,所以对于任何空格和换行,都以跳过处理。 3. 确定各种类型的Token以及处理的方式。 由于书中已经给出了sc语言的定义,关键字的详细说明和处理方式,所以只需要按部就班就可以完成对源码全文的处理。 4.文法解析以及打印时缩进和换行的控制。 根据书中给出的BNF文法定义,依次写出整个源码的文法解析规则。由于书中有对应的解释和示例代码,所以使用scala改写时并无难度。同时,为了控制缩进和换行,引入了两个全局变量(当然用scala改写时作为构造参数全局传递),分别控制缩进等级和是否换行。 可能遇到的问题和解决方案都已经说明,接下来就只需要完成代码的填补就好。但是在实际编写调试过程中也遇到了不少问题。一方面是由于语言的差异(书中以c语言编写)

自下而上语法分析

跟風遠走 提交于 2019-12-06 22:07:33
1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程。 符号栈 输入串 动作 # I+i*i# 移进 #i +i*i# 归约 #F +i*i# 归约 #T +i*i# 归约 #E +i*i# 移进 #E+ i*i# 移进 #E+I *i# 移进 #E+F *i# 归约 #E+T *i# 归约 #E+T* i# 移进 #E+T*I # 归约 #E+T*F # 归约 #E+T # 归约 #E # 接受 2.P121练习1的(1)(2)。 1)计算FIRSTVT和 LASTVT。 2)找三种关系对。 3)构造算符优先关系表。 S->#S# S->a|∧|(T) T->T,S|S 计算FIRSTVT和 LASTVT FIRSTVT(S)={ a , ∧ , ( } FIRSTVT(T)={ , , a , ∧ , ( } LASTVT(S)={a , ∧ , ) } LASTVT(T)={ , , a , ∧ , ) } 找三种关系对 = < > (T) #S# #S (T ,S S# T) T, a ∧ , ( ) # a > > > ∧ > > > , < < > < > ( < < < < = ) > > > # < < < = 来源: https://www.cnblogs.com

自下而上语法分析

只愿长相守 提交于 2019-12-06 20:40:34
1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程。 答: 符号串‘i+i*i#’的"移进-归约"分析过程为: 符号栈 输入串 动作 # i+i*i# 移进 #i +i*i# 归约 #F +i*i# 归约 #T +i*i# 归约 #E +i*i# 移进 #E+ i*i# 移进 #E+i *i# 归约 #E+F *i# 归约 #E+T *i# 归约 #E+T* i# 移进 #E+T*i # 归约 #E+T*F # 归约 #E+T # 归约 #E # 接受 2.P121练习1的(1)(2)。 1)计算FIRSTVT和 LASTVT。 2)找三种关系对。 3)构造算符优先关系表。 解:1) 计算FIRSTVT和 LASTVT。   为:       FIRSTVT(S)={a,^,(}       FIRSTVT(T)={, ,a,^,(}       LASTVT(S)={a,^,)}       LASTVT(T)={,,a,^,)} 解:2) 找三种关系对。   为:       =       #S#       (T)       <       #S       (T       ,S       >       S#       T)       T, 解:3)

自下而上语法分析

你。 提交于 2019-12-06 15:02:35
1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程。 符号栈 输入串 动作 # i+i*i# 移进 #i +i*i# 归约 #F +i*i# 归约 #T +i*i# 归约 #E +i*i# 移进 #E+ i*i# 移进 #E+i *i# 归约 #E+F *i# 归约 #E+T *i# 移进 #E+T* i# 移进 #E+T*i # 归约 #E+T*F # 归约 #E+T # 归约 #E # 接受 2.P121练习1的(1)(2)。 1)计算FIRSTVT和 LASTVT。 2)找三种关系对。 3)构造算符优先关系表。 答: S1 -> #S# S -> a | ^ | (T) T -> T,S | S (1) FIRSTVT(S) = {a , ^ , ( } FIRSTVT(T) = {, , a , ^ , ( } LASTVT(S) = {a , ^ , ) } LASTVT(T) = {, , a , ^ , ) } (2) = : #S# (T) < : #S (T ,S > : S# T) T, (3) a ^ ( ) , # a > > > ^ > > > ( < < < = < ) > > > , < < < > > # < < < = 1.已知文法: E→E+T | T

12.自下而上语法分析

穿精又带淫゛_ 提交于 2019-12-06 13:54:52
1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程。 符号栈 输入符号串 动作 # i+i*i# 移进 #i +i*i# 归约 #F +i*i# 归约 #T +i*i# 归约 #E +i*i# 移进 #E+ i*i# 移进 #E+i *i# 移进 #E+F *i# 归约 #E+T *i# 归约 #E+T* i# 移进 #E+T*i # 归约 #E+T*F # 归约 #E+T # 归约 #E # 接受 2.P121练习1的(1)(2)。 已知文法G[S]为: S->a|^|(T) T->T,S|S 1)计算FIRSTVT和 LASTVT。 2)找三种关系对。 3)构造算符优先关系表。 来源: https://www.cnblogs.com/linyanli/p/11975647.html

自下而上语法分析

百般思念 提交于 2019-12-06 13:09:33
1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程。 符号栈 输入串 动作 # i+i*i# 移进 #i +i*i# 归约 #F +i*i# 归约 #T +i*i# 归约 #E +i*i# 移进 #E+ i*i# 移进 #E+i *i# 归约 #E+F *i# 归约 #E+T *i# 归约 #E+T* i# 移进 #E+T*i # 归约 #E+T*F # 归约 #E+T # 归约 #E # 接受/语法错误 2.P121练习1的(1)(2)。 1)计算FIRSTVT和 LASTVT。 2)找三种关系对。 3)构造算符优先关系表。 S->#S# S->a|∧|(T) T->T,S|S FIRSTVT(S)=( a,∧,( ) FIRSTVT(T)=( ,,a,∧,( ) LASTVT(S)=( a,∧,) ) LASTVT(T)=( ,,a,∧,) ) 关系对: = #S# (T) < #S (T ,S > S# T) T, 优先关系表 a ∧ , ( ) # a > > > ∧ > > > , < < > < > ( < < < < = ) > > > # < < < = 来源: https://www.cnblogs.com/zhff/p/11986492.html

自下而上语法分析

纵饮孤独 提交于 2019-12-06 12:58:44
1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程。 解: i+i*i#语法树如下: 句子 i+i*i 的句柄: i 句子 F+i*i 的句柄: F 句子 T+i*i 的句柄: T 句子 E+i*i 的句柄: i 句子 E+F*i 的句柄: F 句子 E+T*i 的句柄: i 句子 E+T*F 的句柄: T*F 句子 E+T 的句柄: E+T 句子E 2.P121练习1的(1)(2)。 1)计算FIRSTVT和 LASTVT。 2)找三种关系对。 3)构造算符优先关系表。 解: T→#S# S→a|^|(T) T→T,S|S (1) FirstVT(S)={a,^,(} FirstVT(T)={, ,a,^,(} LastVT(S)={a,^,)} LastVT(T)={a,^,), ,} (2)符号对: = (T) #S# < #S (T ,S > S# T) T, (3)优先关系表的构造: 来源: https://www.cnblogs.com/a132/p/11985614.html

作业13:自下而上语法分析

醉酒当歌 提交于 2019-12-06 11:56:24
1.已知文法: E→E+T | T T→T*F | F F→(E) | i 以句柄作为可归约串,写出符号串‘i+i*i#’的"移进-归约"分析过程。 2.P121练习1的(1)(2)。 已知文法G[S]为: S->a|Λ|(T) T->T,S|S 1)计算FIRSTVT和 LASTVT。 S->#S# S->a|Λ|(T) T->T,S|S FIRSTVT(S)={Λ (} FIRSTVT(T)={,} LASTVT(S)={Λ )} LASTVT(T)={,} 2)找三种关系对。 = #S# (T) < #S (T ,S > S# T) 3)构造算符优先关系表。 来源: https://www.cnblogs.com/zhengjieting/p/11981904.html