文档视界 最新最全的文档下载
当前位置:文档视界 › pl0语法分析

pl0语法分析

pl0语法分析
pl0语法分析

#include

#include

#include

#include

#include

#include

using namespace std;

/********************************************************************

/PL0的编译程序C++版

/

/词法分析语法分析符号表

/

/词法分析过程中

/遇到.号就立即结束,无论后面是否有内容都忽略

/遇到非法字符,中断分析并给出错误报告

/遇到超过14个字母的单词,截断成14个字母的,如果他不是数字再截断成10个字母的并给出错误报告

/遇到数字开头的标识符中断分析并给出错误报告

/

/语法分析过程中

/利用词法分析的结果进行分析

/严格按照PL0程序定义来编写

/

/<程序> ::= <程序首部> <分程序>.

/<程序首部> ::= PROGRAM <标识符>;

/<分程序> ::= [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句部分>

/<常量说明部分> ::= CONST <常量定义>{,<常量定义>};

/<常量定义> ::= <标识符>=<无符号整数>

/<变量说明部分> ::= VAR <标识符>{,<标识符>};

/<过程说明部分> ::= <过程首部>;<分程序>;【原课件中没有最后的分号,经分析应该有分号】/<过程首部> ::= PROCEDURE <标识符>

/<语句部分> ::= <语句>|<复合语句>

/<复合语句> ::= BEGIN <语句>{;<语句>} END【符合语句应该注意的是,END前距离END最近的那条语句一定没有分号,其他语句必须有分号】

/<语句>::= <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>

/<赋值语句> ::= <标识符>:=<表达式>

/<读语句> ::= READ(<标识符>{,<标识符>})

/<写语句> ::= WRITE(<表达式>{,<表达式>})

/<过程调用语句> ::= CALL <标识符>【原课件中有分号,实际不应该有】

/<条件语句> ::= IF <条件> THEN <语句>

/<当型循环语句> ::= WHILE <条件> DO <语句>

/<因子> ::= <标识符>|<常量>|(<表达式>)

/<项> ::= <因子>{<乘法运算符><因子>}

/<乘法运算符> ::= *|/

/<表达式> ::= [+|-]<项>{<加法运算符><项>}

/<加法运算符> ::= +|-

/<条件> ::= <表达式><关系运算符><表达式>|ODD <表达式>

/<关系运算符> ::= #|=|>|>=|<|<=

/

/如果上述的任意一个步骤出了问题都会有错误提示,并指出是在源文件中的第几行,是哪一个定义出了问题

/当一个<语句>【复合语句除外】判断成功之后,在词法分析的结果找到这个语句的开始和结束,并输出这个语句是什么语句

/语法分析的实际操作类似一个走迷宫的搜索问题,找到一个可行的方向就前进,直到走到把所有单词都分析完,或者走不通了,一层层回溯返回FALSE给出错误信息

/

/符号表

/符号表的建立是在语法分析的深度优先搜索的基础上完成的

/基于深度优先搜索的特点当一个过程分析完,直接就能得到它的层级

/变量的LEVEL等于定义该变量的过程的LEVEL+1

/每个过程的变量的ADR都重新从3开始递增

/常量没有LEVEL,没有ADR,

/变量和常量都没有SIZE

/当程序的变量分析完就得到了符号表中最近插入的过程的SIZE【SIZE等于该过程的最后一个变量的ADR+1,若该过程没有变量则等于3】

/

*******************************************************************/

typedef struct t{

string name,kind;

int val,lev,adr,size;

}Table;

bool isChengXu(int lev);

bool isFenChengXu(int lev);

bool isChengXuShouBu();

bool isChangLiangShuoMing();

bool isBianLiangShuoMing();

bool isGuoChengShuoMing(int lev);

bool isYuJuBuFen();

bool isChangLiangDingYi();

bool isGuoChengShouBu(int lev);

bool isYuJu();

bool isFuHeYuJu();

bool isFuZhiYuJu();

bool isWhileDoYuJu();

bool isIfYuJu();

bool isCallYuJu();

bool isWriteYuJu();

bool isReadYuJu();

bool isTiaoJian();

bool isYinZi();

bool isXiang();

bool isBiaoDaShi();

void printYuFa(int x,int y,string statement);//输出语法分析的结果

void addtotable(string name,string kind,int val,int lev,int adr,int size);//把记录加入符号表

int stoi(string s);//字符串转化成数字

string itos(int n);//数字转化成字符串

int error(int e,int eline);//指出在eline行有错误e

bool isNumber(string s);//判断一个字符串是不是一个数字

string strtoupper(string s);//把字符串转换为大写

string strtolower(string s);//把字符串转换为小写

int lvkongge(string mSourse,int &i);//虑空格,遇到文件末尾结束,返回-1

string getnext(string mSourse,int &i);//从源文件中识别一个单词并返回

bool cifafenxi(string mSourse);//词法分析的主函数,执行虑空格操作,然后用getnext函数获取下一个单词进行分析,依次循环知道lvkongge函数返回-1

void initmp();//初始化保留字界符的查找表,

bool nexteql(string s);//从词法分析的结果顶部取出一个单词,判断s是否与之相等,不相等返回FALSE,相等返回TRUE并且顶部指针指向词法分析结果的下一个单词

void printYuFa(int x,int y,string statement);//输出语句,在词法分析的结果数组中下标号从x 到y是一个statement语句,遍历输出这个语句

void printtable();//输出符号表

void printErrors();//输出错误报告

map words;//保留字,界符等等,的对照表

string wQueue[200][2];//词法分析的最终结果,模拟成一个队列【wQueue[i][0]是第i个位置的单词,wQueue[i][1]是第i个单词的类别】

int whead=0,wtail=0;//队列的头,尾指针

int wline[200]={0},line=1;//单词的行号,与wQueue对应

string name;//每一次调用nexteqls函数都会改变,具体看nexteqls函数

string errors[100];//存储的错误信息

int etop=0;

Table table[100];

int tabletop=0,padr=1,pradr=3,plev=-1,ltx=0;

void addtotable(string name,string kind,int val,int lev,int adr,int size){//添加一条信息到符号表table[tabletop].name=name;

table[tabletop].kind=kind;

table[tabletop].val=val;

table[tabletop].lev=lev;

table[tabletop].adr=adr;

table[tabletop++].size=size;

if(kind=="PROCEDURE"){

plev=lev,pradr=3;

if(tabletop>0){

table[ltx].size=table[tabletop-2].adr==-1?3:(1+table[tabletop-2].adr);

}

ltx=tabletop-1;

}

}

string find(string s){

int i=0;

while(i

if(table[i].name==s){

return table[i].kind;

}

i++;

}

return "@_@";

}

int stoi(string s){//把字符串转换成整数

int i=-1;

int r=0;

while(s[++i]){

r*=10;

r+=s[i]-'0';

}

return r;

}

string itos(int n){//把整数n转换成string型

string s;

char c[10]="";

int l=8;

c[9]=0;

while(n>=10){

c[l--]=n%10+'0';

n/=10;

}

c[l--]=n+'0';

s=c+(++l);

return s;

}

int error(int e,int eline) { //错误处理

switch(e){

case 0:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有非法字符";

break;

}

case 1:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有超过14个字母的单词";

break;

}

case 2:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有数字开头的标识符";

break;

}

case 3:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有超过10个字母的标识符";

break;

}

case 4:{

errors[etop++]=itos(e)+": "+itos(eline)+"行程序结尾没有.";

break;

}

case 5:{

errors[etop++]=itos(e)+": "+itos(eline)+"行程序首部标识符后面没有;";

break;

}

case 6:{

errors[etop++]=itos(e)+": "+itos(eline)+"行程序首部PRAGRAM后面没有标识符";

break;

}

case 7:{

errors[etop++]=itos(e)+": "+itos(eline)+"行没有程序首部";

break;

}

case 8:{

errors[etop++]=itos(e)+": "+itos(eline)+"行分程序后缺少语句部分";

break;

}

case 9:{

errors[etop++]=itos(e)+": "+itos(eline)+"行常量说明的,字符后面有错误";

break;

}

case 10:{

errors[etop++]=itos(e)+": "+itos(eline)+"行常量说明后面没有;结尾";

break;

}

case 11:{

errors[etop++]=itos(e)+": "+itos(eline)+"行常量定义有错误";

break;

}

case 12:{

errors[etop++]=itos(e)+": "+itos(eline)+"行变量说明多了,";

break;

}

case 13:{

errors[etop++]=itos(e)+": "+itos(eline)+"行变量说明没有;结尾";

break;

}

case 14:{

errors[etop++]=itos(e)+": "+itos(eline)+"行VAR后面没有定义的标识符";

break;

}

case 15:{

errors[etop++]=itos(e)+": "+itos(eline)+"行分程序后面没有;结尾";

break;

}

case 16:{

errors[etop++]=itos(e)+": "+itos(eline)+"行过程说明后面没有分程序";

break;

}

case 17:{

errors[etop++]=itos(e)+": "+itos(eline)+"行过程首部后面没有;结尾";

break;

}

case 18:{

errors[etop++]=itos(e)+": "+itos(eline)+"行常量定义没有指定数字";

break;

}

case 19:{

errors[etop++]=itos(e)+": "+itos(eline)+"行常量定义没有=字符";

break;

}

case 20:{

errors[etop++]=itos(e)+": "+itos(eline)+"行过程首部PROCEDURE后面并没有标识

符";

break;

}

case 21:{

errors[etop++]=itos(e)+": "+itos(eline)+"行语句后面没有;结尾";

break;

}

case 22:{

errors[etop++]=itos(e)+": "+itos(eline)+"行没有END结尾,或者此行语句缺少;结尾";

break;

}

case 23:{

errors[etop++]=itos(e)+": "+itos(eline)+"行复合语句的BEGIN后面不是语句";

break;

}

case 24:{

errors[etop++]=itos(e)+": "+itos(eline)+"行赋值语句后面不是表达式";

break;

}

case 25:{

errors[etop++]=itos(e)+": "+itos(eline)+"行赋值语句没有:=赋值号";

break;

}

case 26:{

errors[etop++]=itos(e)+": "+itos(eline)+"行READ语句参数中有非法,字符";

break;

}

case 27:{

errors[etop++]=itos(e)+": "+itos(eline)+"行READ语句缺少)字符";

break;

}

case 28:{

errors[etop++]=itos(e)+": "+itos(eline)+"行READ语句缺少标识符";

break;

}

case 29:{

errors[etop++]=itos(e)+": "+itos(eline)+"行READ语句缺少(字符";

break;

}

case 30:{

errors[etop++]=itos(e)+": "+itos(eline)+"行WRITE语句参数中有非法,字符";

break;

}

case 31:{

errors[etop++]=itos(e)+": "+itos(eline)+"行WRITE语句缺少)字符";

break;

}

case 32:{

errors[etop++]=itos(e)+": "+itos(eline)+"行WRITE语句缺少标识符";

break;

}

case 33:{

errors[etop++]=itos(e)+": "+itos(eline)+"行WRITE语句缺少(字符";

break;

}

case 34:{

errors[etop++]=itos(e)+": "+itos(eline)+"行CALL语句没有过程名字";

break;

}

case 35:{

errors[etop++]=itos(e)+": "+itos(eline)+"行IF语句的THEN后面不是合法语句";

break;

}

case 36:{

errors[etop++]=itos(e)+": "+itos(eline)+"行IF语句的条件后面没有THEN";

break;

}

case 37:{

errors[etop++]=itos(e)+": "+itos(eline)+"行IF语句后面不是合法条件";

break;

}

case 38:{

errors[etop++]=itos(e)+": "+itos(eline)+"行WHILE语句的DO后面不是合法语句";

break;

}

case 39:{

errors[etop++]=itos(e)+": "+itos(eline)+"行WHILE语句没有DO";

break;

}

case 40:{

errors[etop++]=itos(e)+": "+itos(eline)+"行WHILE语句后面不是合法的条件";

break;

}

case 41:{

errors[etop++]=itos(e)+": "+itos(eline)+"行表达式的右边缺少)字符";

break;

}

case 42:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有非法表达式";

break;

}

case 43:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有非法因子";

break;

}

case 44:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有非法项";

break;

}

case 45:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有非法项";

break;

}

case 46:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有非法项";

break;

}

case 47:{

errors[etop++]=itos(e)+": "+itos(eline)+"行有非法项";

break;

}

case 48:{

errors[etop++]=itos(e)+": "+itos(eline)+"行关系运算符有非法表达式";

break;

}

case 49:{

errors[etop++]=itos(e)+": "+itos(eline)+"行ODD有非法表达式";

break;

}

case 101:{

errors[etop++]=itos(e)+": "+itos(eline)+"行给非变量赋值或变量没有定义";

break;

}

case 102:{

errors[etop++]=itos(e)+": "+itos(eline)+"行read语句读入非变量或变量没有定义";

break;

}

case 103:{

errors[etop++]=itos(e)+": "+itos(eline)+"行read语句读入非变量或变量没有定义

";

break;

}

case 106:{

errors[etop++]=itos(e)+": "+itos(eline)+"行call语句后面不是过程名称或过程没有定义";

break;

}

case 107:{

errors[etop++]=itos(e)+": "+itos(eline)+"行因子出错";

break;

}

}

return e;

}

bool isNumber(string s){//判断s是不是数字

int i=0;

while(s[i]){

if(s[i]<'0'||s[i]>'9'){

return false;

}

i++;

}

return true;

}

string strtoupper(string s){//转化成大写

return s;

int i=0;

while(s[i]){

if(s[i]>='a'&&s[i]<='z')

s[i]-=32;

i++;

}

return s;

}

string strtolower(string s){//转化成小写

return s;

int i=0;

while(s[i]){

if(s[i]>='A'&&s[i]<='Z')

s[i]+=32;

i++;

}

return s;

}

//虑空格

int lvkongge(string mSourse,int &i) {

if(i<0)return -1;

while(mSourse[i]==32||mSourse[i]==9||mSourse[i]==10){

if(mSourse[i]=='\n')

line++;

i++;

}

if(mSourse[i]==0)return -1;

return i;

}

//获得下一个单词

string getnext(string mSourse,int &i) {

string word;

while(mSourse[i]!=' '&&mSourse[i]!='\n') {

if((mSourse[i]>='a'&&mSourse[i]<='z')||(mSourse[i]>='A'&&mSourse[i]<='Z')||(mSourse[i]>='0'& &mSourse[i]<='9')){

word+=mSourse[i];

i++;

continue;

}

switch(mSourse[i]) {

case ';': {

return word==""?(i++,";"):word;

break;

}

case '.': {

return word==""?(i=-1,"."):word;

break;

}

case ',': {

return word==""?(i++,","):word;

break;

}

case '(': {

return word==""?(i++,"("):word;

break;

}

case ')': {

return word==""?(i++,")"):word;

break;

}

case '<': {

if(mSourse[i+1]=='='&&word=="")return (i+=2,"<=");

return word==""?(i++,"<"):word;

break;

}

case '>': {

if(mSourse[i+1]=='='&&word=="")return (i+=2,">=");

return word==""?(i++,">"):word;

break;

}

case ':': {

if(mSourse[i+1]=='='&&word=="")return (i+=2,":=");

return word==""?(i++,":"):word;

break;

}

case '=': {

return word==""?(i++,"="):word;

break;

}

case '+': {

return word==""?(i++,"+"):word;

break;

}

case '-': {

return word==""?(i++,"-"):word;

break;

}

case '*': {

return word==""?(i++,"*"):word;

break;

}

case '/': {

return word==""?(i++,"/"):word;

break;

}

case '#': {

return word==""?(i++,"#"):word;

break;

}

default:{

return "@_@";//如果是非法字符

}

}

word+=mSourse[i];

i++;

}

return word;

}

//词法分析函数

bool cifafenxi(string mSourse) {

int i=0;

string word;

while(1) {

if(lvkongge(mSourse,i)==-1)break;

word=getnext(mSourse,i);

if(word=="@_@"){

error(0,line);//cout<

return false;

}

//word=strtoupper(word);

if(words.find(word)!=words.end()) { //词法分析把结果存入队列

wQueue[wtail][0]=word;

wline[wtail]=line;

wQueue[wtail++][1]=words[word];

} else {

//word=strtolower(word);

if(word.length()>14){

word=word.substr(0,14);//名称过长

if(isNumber(word)) {

word="0";

}

error(1,line);//cout<

}

if(isNumber(word)) {

wQueue[wtail][0]=word;

wline[wtail]=line;

wQueue[wtail++][1]="NUMBER";

}else {

if(word[0]>='0'&&word[0]<='9'){

error(2,line);//数字开头的标识符非法

return false;

}

if(word.length()>10){

word=word.substr(0,10);//名称过长

error(3,line);//cout<

}

wQueue[wtail][0]=word;

wline[wtail]=line;

wQueue[wtail++][1]="IDENT";

}

}

}

return true;

}

//初始化保留字、界符对照表

void initmp() {

words["BEGIN"]="BEGINSYM";

words["CALL"]="CALLSYM";

words["CONST"]="CONSTSYM";

words["DO"]="DOSYM";

words["END"]="ENDSYM";

words["IF"]="IFSYM";

words["ODD"]="ODDSYM";

words["PROCEDURE"]="PROCSYM";

words["PROGRAM"]="PROGSYM";

words["READ"]="READSYM";

words["THEN"]="THENSYM";

words["VAR"]="VARSYM";

words["WHILE"]="WHILESYM";

words["WRITE"]="WRITESYM";

words[":="]="BECOMES";

words["+"]="PLUS";

words["-"]="MINUS";

words["*"]="TIMES";

words["/"]="SLASH";

words["("]="LPAREN";

words[")"]="RPLREN";

words["<"]="LQT";

words[">"]="RQT";

words["<="]="LEQ";

words[">="]="REQ";

words["="]="EQL";

words[","]="COMMA";

words["."]="PERIED";

words["#"]="NEQ";

words[";"]="SEMICOLON";

}

bool nexteql(string s){//判断wQueue中的whead位置的字符是否等于s,如果等于则whead++,返回true并且更改全局变量name的值

string tmp=wQueue[whead][1];

line=wline[whead];

name=wQueue[whead++][0];

if(s=="guanxiyunsuan"){

if(tmp=="NEQ"||tmp=="RQT"||tmp=="REQ"||tmp=="EQL"||tmp=="LEQ"||tmp=="LQT"){ return true;

}

}else if(s=="*/"){

if(tmp=="TIMES"||tmp=="SLASH"){

return true;

}

}else if(s=="+-"){

if(tmp=="PLUS"||tmp=="MINUS"){

return true;

}

}else if(tmp==s){

return true;

}

whead--;

if(whead!=0)

line=wline[whead-1];

if(whead==wtail-1){

table[ltx].size=table[tabletop-1].adr==-1?3:(1+table[tabletop-1].adr);

}

return false;

}

bool isChengXu(int lev){

if(isChengXuShouBu()){

if(isFenChengXu(lev)){

if(nexteql("PERIED")){

return true;

}else{

error(4,line);//程序没有.结尾

}

}

}

return false;

}

bool isChengXuShouBu(){

if(nexteql("PROGSYM")){

if(nexteql("IDENT")){

string name1=name;

if(nexteql("SEMICOLON")){

addtotable(name1,"PROGRAM",0,0,0,3);

return true;

}else{

error(5,line);//程序首部没有;结尾

}

}else{

error(6,line);//PROGSYM后面没有标识符}

}else{

error(7,line);//程序首部没有PROGSYM声明}

return false;

}

bool isFenChengXu(int lev){

while(isChangLiangShuoMing());

while(isBianLiangShuoMing());

while(isGuoChengShuoMing(lev));

if(isYuJuBuFen()){

return true;

}else{

error(8,line);//没有语句说明部分

}

return false;

}

bool isChangLiangShuoMing(){

if(nexteql("CONSTSYM")){

if(isChangLiangDingYi()){

while(nexteql("COMMA")){

if(isChangLiangDingYi()){

continue;

}else{

error(9,line);//常量定义错误

}

}

if(nexteql("SEMICOLON")){

return true;

}else{

error(10,line);//没有;结尾

}

}else{

error(11,line);//常量定义错误

}

}else{

return false; //不是常量说明

}

return false;

}

bool isBianLiangShuoMing(){

if(nexteql("VARSYM")){

if(nexteql("IDENT")){

addtotable(name,"VARIABLE",0,plev+1,pradr++,-1);

while(nexteql("COMMA")){

if(nexteql("IDENT")){

addtotable(name,"VARIABLE",0,plev+1,pradr++,-1);

continue;

}else{

error(12,line);//逗号后面不是标识符

}

}

if(nexteql("SEMICOLON")){

return true;

}else{

error(13,line);//没有;结尾

}

}else{

error(14,line);//VAR后面没有标识符

}

}else{

return false;

}

return false;

}

bool isGuoChengShuoMing(int lev){

if(isGuoChengShouBu(lev)){

if(nexteql("SEMICOLON")){

if(isFenChengXu(lev+1)){

if(nexteql("SEMICOLON")){

return true;

}else{

error(15,line);//分程序后面没有;结尾

}

}else{

error(16,line);//过程说明后面没有分程序

}

}else{

error(17,line);//过程首部后面缺少分号

}

}else{

return false;//不是过程说明

}

return false;

}

bool isYuJuBuFen(){

if(isYuJu()){

return true;

}else if(isFuHeYuJu()){

return true;

}else{

return false;

}

return false;

}

bool isChangLiangDingYi(){

if(nexteql("IDENT")){

string s=name;

if(nexteql("EQL")){

if(nexteql("NUMBER")){

addtotable(s,"CONST",stoi(name),-1,-1,-1);

return true;

}else{

error(18,line);//常量定义中标识符后面没有数字}

}else{

error(19,line);//没有等号

}

}else{

return false;//不是常量定义

}

return false;

}

bool isGuoChengShouBu(int lev){

if(nexteql("PROCSYM")){

if(nexteql("IDENT")){

addtotable(name,"PROCEDURE",0,lev,padr++,3);

return true;

}else{

error(20,line);//过程首部没有标识符

}

}else{

return false;//不是过程首部

}

return false;

}

bool isYuJu(){

if(isFuZhiYuJu()){

return true;

}else if(isIfYuJu()){

return true;

}else if(isWhileDoYuJu()){

return true;

}else if(isCallYuJu()){

return true;

}else if(isWriteYuJu()){

return true;

}else if(isReadYuJu()){

return true;

}else if(isFuHeYuJu()){

return true;

}else{

return false;//不是语句

}

return false;

}

bool isFuHeYuJu(){

if(nexteql("BEGINSYM")){

if(isYuJu()){

while(nexteql("SEMICOLON")){

if(isYuJu()){

continue;

}else{

error(21,line);//没有;结尾

}

}

if(nexteql("ENDSYM")){

return true;

}else{

error(22,line);//没有END结尾

}

}else{

error(23,line);//BEGIN后面不是语句;

}

}else{

return false;//不是复合语句

}

return false;

}

bool isFuZhiYuJu(){

int x=whead;

if(nexteql("IDENT")){

if(find(name)!="VARIABLE"){

error(101,line);

return false;

}

if(nexteql("BECOMES")){

if(isBiaoDaShi()){

printYuFa(x,whead,"赋值");

return true;

}else{

error(24,line);//不是表达式

}

}else{

error(25,line);//没有BECOMES符号

}

}else{

return false;//不是赋值语句

}

return false;

}

bool isReadYuJu(){

int x=whead;

if(nexteql("READSYM")){

if(nexteql("LPAREN")){

if(nexteql("IDENT")){

if(find(name)!="VARIABLE"){

error(102,line);

return false;

}

while(nexteql("COMMA")){

if(nexteql("IDENT")){

if(find(name)!="VARIABLE"){

error(103,line);

return false;

}

continue;

}else{

error(26,line);//逗号后没有标识符

编译原理实验报告《LL(1)语法分析器构造》

《LL(1)分析器的构造》实验报告 一、实验名称 LL(1)分析器的构造 二、实验目的 设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。 三、实验内容和要求 设计并实现一个LL(1)语法分析器,实现对算术文法: G[E]:E->E+T|T T->T*F|F F->(E)|i 所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+++*i+不是文法所定义的句子。 实验要求: 1、检测左递归,如果有则进行消除; 2、求解FIRST集和FOLLOW集; 3、构建LL(1)分析表; 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。 四、主要仪器设备 硬件:微型计算机。 软件: Code blocks(也可以是其它集成开发环境)。 五、实验过程描述 1、程序主要框架 程序中编写了以下函数,各个函数实现的作用如下: void input_grammer(string *G);//输入文法G

//将文法G预处理得到产生式集合P,非终结符、终结符集合U、u, int eliminate_1(string *G,string *P,string U,string *GG);//消除文法G中所有直接左递归得到文法GG int* ifempty(string* P,string U,int k,int n);//判断各非终结符是否能推导为空 string* FIRST_X(string* P,string U,string u,int* empty,int k,int n);求所有非终结符的FIRST集 string FIRST(string U,string u,string* first,string s);//求符号串s=X1X2...Xn的FIRST集 string** create_table(string *P,string U,string u,int n,int t,int k,string* first);//构造分析表 void analyse(string **table,string U,string u,int t,string s);//分析符号串s 2、编写的源程序 #include #include #include using namespace std; void input_grammer(string *G)//输入文法G,n个非终结符 { int i=0;//计数 char ch='y'; while(ch=='y'){ cin>>G[i++]; cout<<"继续输入?(y/n)\n"; cin>>ch; } } void preprocess(string *G,string *P,string &U,string &u,int &n,int &t,int &k)//将文法G预处理产生式集合P,非终结符、终结符集合U、u, { int i,j,r,temp;//计数 char C;//记录规则中()后的符号 int flag;//检测到() n=t=k=0; for( i=0;i<50;i++) P[i]=" ";//字符串如果不初始化,在使用P[i][j]=a时将不能改变,可以用P[i].append(1,a) U=u=" ";//字符串如果不初始化,无法使用U[i]=a赋值,可以用U.append(1,a) for(n=0;!G[n].empty();n++) { U[n]=G[n][0]; }//非终结符集合,n为非终结符个数 for(i=0;i

英语语法、句式、简单句子结构(透彻分析)

LESSON ONE 句子的三种模式 导言本课的重点是掌握英语的三种基本句型,注意词性和词序,以及定语的位置,同时注意中英文表达上的相同和不相同的地方。三种基本句型虽然简单,但至关重要。掌握好它们,在今后的学习中有一通百通之效。 其实英语只有三种基本句型 ▲主+系动词+表 词序 1 主语 2 系动词 3 表语 即句子的用于连接主语表示主语身份、状态以及主体和表语所处的位置 词性* 名词 代词 Be (is, am, are) * 名词形容词 介词+* 名词(介词短语) 注:*注意该结构中的名词,它们能被定语修饰。 1 这个人是一个老师。The man is a teacher. 主语系表语主语系表语(名词) 2 他(是)很忙。He is busy. 主语系表语主语系表语(形容词)▲注意中文中的系动词经常被省略,而英文中绝不能省。

3 她(是)在教室里。She is in the classroom. 主语系表语主语系表语(介词短语) ▲定语只修饰名词,不破坏句子的基本结构。通常由形容词和介词短语充当,形容词放在所修饰的名词之前,而介词短语放在所修饰的名词之后,请注意英语与汉语词序的不同。看懂中文的定语是翻译好定语的关键。 介词短语 4 幸福是太多和太少之间的一站。--- 英国法学家波洛克 介词短语 Happiness i s a station between too much and too little . -----------Pollock, British jurist 形容词介词短语 5 高个子的男人是从英国来的老师。

形容词介词短语 The tall man is a teacher from England. 介词短语形容词 6. 她在二楼的小教室里。 形容词介词短语 She is i n the small classroom on the second floor. The teacher in the classroom is handsome. My book is o n the deskin the classroom. 表语(介词短语)定语(介词短语)She is in the small classroom on t he second floor.

英语语法大全 句子成分分析

句子成分分析 在句中起着不同语法作用的成分,叫做句子成分。英语的句子成分有九种: 1、主语(subject)表示句子描述的是“谁”或“什么”,是谓语的陈述对象; 通常由名词、代词、动词不定式、动名词或从句等担任: The sun rises in the east. 日出东方。(名词) He hated to see any bird killed.他讨厌看到鸟儿被杀。(代词) To see is to believe.眼见为实。(动词不定式) Seeing is believing.眼见为实。(动名词) Where we shall hold the party is not decided yet.我们还没有决定在何处举行晚会。(主语从句) It’s human to want something better.精益求精是人类的特性。(不定式) 2、谓语动词(predicate verb)说明主语的动作或状态,由动词或动词短语担任: We study English.我们学习英语。(动词) The car broke down on the way.车在路上抛锚了。(动词短语) Do be quiet,children.孩子们,务必安静点。(助动词+连系动词) We are having a meeting now.我们现在正在开会。(助动词+实义动词) Soldiers must obey orders.军人必须服从命令。(情态动词+实义动词) 3、表语(predicative)说明主语的性质、特征、状态或身份,与连系动词一起构成复合谓语,通常由名词、代词、形容词、数词、副词、介词短语、动词不定式、动名词、分词或从句等担任: The next stop is the zoo.下一站是动物园。(名词) The game is yours.你(们)胜了。(代词) I was first! 我第一名!(数词) I feel terrible.我难受的厉害。(形容词) Is your mother in?你妈妈在家吗?(副词) I’m with you.我站在你这一边。(介词短语) Mary’s task is to set the table.玛丽的任务是摆桌子。(动词不定式) Her hobby is growing roses.她的爱好是种植玫瑰。(动名词) The situation is puzzling.形式令人迷惑不解。(现在分词) Do you feel satisfied with the arrangement?你对这安排满意吗?(过去分词) The fact is that they are cross with each other.事实是他们生彼此的气。(表语从句) That’s where you are wrong.这就是你错的地方(表语从句) He is no longer what he was.他已经不是以前的他了。(表语从句) 4、宾语(object)表示及物动词或及物动词短语的对象或内容,或用于介词后构成介词短语;通常由名词、代词、数词、动词不定式、动名词或从句等担任: May I have your attention ,please.请大家注意。(名词) I want a little.我要一点。(代词) I need two.我需要两个。(数词) Hope to see you soon.希望能很快见到你。(动词不定式) They risk losing everything.他们冒着失去一切的危险。(动名词) He insisted on seeing her home.他坚持送她回家。(动名词作介词的宾语) I’ll do what I can.我将尽力而为。(从句)

关于网络语言的语法特征分析

论文关键词:网络语言语法特征合理性实用性论文摘要:本文从语法学的角度,对网络语言在语音、词汇、句法结构各层面的特点进行了分析,旨在承认其合理性和实用性。20世纪90年代,随着互联网的兴起和发展,它几乎渗透到世界各地和人们生活的各个角落,同时也深刻地影响着人们的语言生活,一种新的语言现象—网络语言出现了。以电子邮件、BBS、网上论坛、虚拟社区、聊天室、ICQ、网络游戏、短消息为主要载体,通过对一些汉语和英语词汇进行改造,对文字、图片、符号等随意链接和镶嵌,网民们创造出了大量的汉字、数字、英文字母混杂组合的新词汇,催生出了现代汉语的一种变异形式。本文拟从语法学的角度,对网络语言这种现象的产生和发展进行探讨。1语音特征谐音法的广泛使用是网络语言的一个重要的语音特征。在网络交际中,人们为了达到追求时尚、诙谐有趣、尽量满足读者的阅读快感的目的,需要利用一种快速便捷的语言形式来表达自己的心声,谐音法成为最佳的选择。其特点是利用汉语、英语或一些数字同一读音往往有多个不同形义的特点,采取声东击西,偷梁换柱的手法,假借此字之声音、而指彼字之形义,从而达到面底相扣之目的。作为世界通用语的英语也成为人们,尤其是年轻人所追捧的时尚,用同音字母代表一个单词或字母组合乃至句子更显其与众不同,应用洋泾浜英语更能表达自己的幽默风趣。具体表现有数字谐音,如886—拜拜了,9494—就是就是。汉语谐音,如菌男—俊男,斑竹—版主。英语谐音,如b-be/bee,c-see,爱老虎油—I love you,伊妹儿—Email。2词汇特征与语音、句法结构相比,词汇的变化更为突出。由于网络的普及,作为一种非正式文体,网络语言在构词法方面有其独特的方式。它偏爱使用缩写词、俚语等非正式词汇,甚至还随机杜撰某些词语,因此具有明显的随意性特征。因为网络的使用是以时间为收费基准的,这就要求网络交际必须快捷高效。在此语境下,英汉两种语言兼收并用,大量使用简写词和各种缩略词便成为网络语言不断产生的最重要的特征。另外,转换法也被广泛使用,给人以耳目一新的感觉。其特征主要体现在以下几个方面。(1)大量使用缩略词。戴炜栋认为,一个词可以由一个词或短语减缩而成,这种构词法称为缩略法。而利用一个短语中的各个词的首字母构成的缩略语叫首字母缩略词。在网络语言中,缩略语的来源主要是以公认的汉语拼音或英语首字母缩写而成,或用数字代替字母缩合而成词。如:BT(变态),PLMM (漂亮美眉),MM(妹妹),PK(player kill)。(2)大量运用表情符号。现代人的思想意识有别于以往,之所以这样,一个重要的地方就在于其具有追新、追奇、追时尚的心理。由于网络是一个虚拟的空间,人与人之间还不能够实现面对面的交谈,所以一些字母、数字和特殊符号的组合就被用来表达喜怒哀乐等等情感和标新立异的手段。网络语言巧妙地将这些交际中不可缺少的成分转化成用各种数字和符号组成的表情符号,使看似冷冰冰没有直接的感情交流的键盘交际变得充满人情味和生动有趣,也充满了刺激。由于这些符号的组合形象生动,被大多数人所接受,所以在约定俗成以后,发展成为了网络语言中一个重要的补充体系。例如:表示肢体语言的符号有(∧)挤眉弄眼,(@@)童心未泯,等等。表示言语行为的符号有(//sigh)叹气的动作、(//grin)咧嘴笑。在一个词前面加上“//”,就把该词变成了一种言语行为。[!--empirenews.page--][1][2]下一页(3)大量使用旧词新义词。吕叔湘、陈原先生曾明确地指出:新词新语既包括不久之前产生,其含义、色彩和表现形式都给人们以新颖感的那种词语,也包括旧有词语的新义项、新用法。旧词新义词流行固然鱼龙混杂,但从另一个角度看,它或许也是对传统语言规范中那些束缚人们语言发展的某些语言形式的一种反叛。据此,在网络这个虚拟世界中,网民们乐意使用这样的一些词汇。如恐龙(丑女人)、蛋白质(笨蛋+白痴+神经质)、稀饭(喜欢)等。超女大赛中出现的“玉米”、“盒饭”、“凉粉”,这无不说明旧词新义词生机勃勃的发展态势。3句法特征网络语言是使用因特网技术发展下人际交流的产物,是规范语言的变体。因为在虚拟的世界中进行交流和沟通,必然导致网络语言的随意性。网民在交流的过程中,往往不仅将汉字中的词语信手拈来,随意改造,或是与一些英文字母和网络符号交织在一起,不仅形

语法分析程序报告

xx理工大学 《编译原理》 题目语法分析程序 姓名: 学号: 班级:

一、实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 2.1 待分析的简单语言的语法 用扩充的BNF表示如下: ⑴<程序>::=begin<语句串>end ⑵<语句串>::=<语句>{;<语句>} ⑶<语句>::=<赋值语句> ⑷<赋值语句>::=ID:=<表达式> ⑸<表达式>::=<项>{+<项> | -<项>} ⑹<项>::=<因子>{*<因子> | /<因子> ⑺<因子>::=ID | NUM | (<表达式>) 2.2 实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。 例如: 输入begin a:=9; x:=2*3; b:=a+x end # 输出success 输入x:=a+b*c end # 输出error 2.3 语法分析程序的酸法思想 ⑴主程序示意图如图2-1所示。 图2-1 语法分析主程序示意图 ⑵递归下降分析程序示意图如图2-2所示。 ⑶语句串分析过程示意图如图2-3所示。

图2-2 递归下降分析程序示意图 图2-3 语句串分析示意图 ⑷statement 语句分析程序流程如图2-4、2-5、2-6、2-7所示。 图2-4 statement 语句分析函数示意图 图2-5 expression 表达式分析函数示意图

图2-7 factor分析过程示意图三、语法分析程序的C语言程序源代码 #include "stdio.h" #include "string.h" char prog[100],token[8],ch; char *rwtab[6]={"begin","if","then","while","do","end"}; int syn,p,m,n,sum; int kk; factor(); expression(); yucu(); term(); statement(); lrparser(); scaner(); main() { p=kk=0; printf("\nGrade:05 Class:03 Name:Qiyubing Number:200507096 \n"); printf("\n----Please input the string end with '#':-------- \n"); do

英语语法 句子成分分析

知识精讲 一、整体把握 成分用法说明位置 主语是执行句子的行为或动作的主 体。 陈述句中放在句首或谓语之前;疑问句或倒装句 中放在动词、助动词、情态动词之后;there be结 构中放在be之后;祈使句中常省 谓语对主语加以陈述,说明主语怎 么样或是什么。必须由动词担 任,其人称和数必须和主语一 致。 通常在主语后(疑问句、倒装句除外)。 表语与系动词连用,一起构成复合 谓语,说明主语的性质、特征、 身份、类别、状态等。 常在系动词之后。 宾语表示动作、行为的对象。一般放在及物动词或介词后。间接宾语通常放在直接宾语之前。直接宾语是人称代词,间接宾语是名词或两个宾语都是人称代词时,间接宾语放在直接宾语之后,并在间接宾语前加to或for。 定语用来修饰名词或代词,说明人 或物的状态、品质、数量及所 属等。 单个词常在被修饰的词前,短语或句子在被修饰 的词之后;副词作定语常放在被修饰的伺候;形 容词修饰不定代词放在被修饰的伺候。 状语修饰动词、形容词、副词,表 示动作发生的时间、地点、目 的、方式等。 位置比较灵活。 补语补充说明宾语或主语的成分。宾语补足语通常置于宾语之后,主语补足语通常置于主语和谓语之后。 同位语对句子中某一成分作进一步解 释、说明,与前面的被修辞成 分在语法上处于同等地位。 常常置于被说明的成分之后。有时可以放在句子 的前面(主语之前),尤其是主语为人称代词时, 为平衡句子的节奏,则把同位语放置于此代词前。 独立成分独立成分是指句子里的一个词 或词组与全局没有语法上的联 系,不属于句子的组成部分; 一般由感叹语、呼语或插入语 等担任。 可放在句首、句中或句末。 二、细讲:主语 表现形式例句

语法分析方法

语法分析方法 句子成分分析法 句子成分分析法也叫做中心词分析法。 句子成分分析法的总的特 点是:认定语法分析就是分析一个句子(单句)的句子成分。分析的过程是:(1)先看全句的主要成分,哪个是主语,哪个是谓语;(2)再看充当谓语的动词是不是及物动词,以决定后面是否有连带成分宾语;(3)最后指出附加在主语、宾语之前、谓语之后的所有附加成分句子成分分析法的作用 句子成分分析法在汉语语法研究和语法教学中起过积极的作用。在其他分析方法借鉴、运用到汉语语法研究中来之前,就是靠它建立了汉语语法学,普及了语法知识。句子成分分析法 “ ” 这样,对汉语来说,光是分析层次,远远不足以说明某一语言片段的特征,因此,汉语中运用层次分析法既要讲切分,又要讲定性。 层次分析法的作用 由于层次分析法符合语言的语法构造特点,因此它在语法研究中能起较好的作用。具体表现如下: (1)层次分析法的适用面比较广。它既可以用来分析单句的结构,也可以用来分析复句的结构,还可以用来分析合成词的结构。 (2)可以更好地分化歧义句式。例如上文的“这张照片放大了一点儿”是个歧义句,句子成分分析法不能加以分化,但层次分析法可以很好地加以分化。

(3)可以把语法研究引向深入,更好地揭示语法规律。例如,汉语中动词单独作谓语不自由,到很大的限制,这正是通过层次分析法所获得的一条语法规律。运用层次分析法,不仅要考虑从什么地方切分,而且还要考虑为什么从这个地方切分,这就把语法研究引向了深入。 层次分析法的局限性 层次分析法也有它的局限性。它只能揭示句子内部的构造层次和显形的语法关系,不能揭示句法结构内部的隐性语法关系。例如: 山上架着炮。 门外修着马路。 “山上架着炮”是一个有歧义的句子,它即可以表示(A)“山上有炮”的意思,也可以表示 黑板上写着字。→字写在黑板上。 墙上挂着画。→墙上挂着画。 门上贴着对联。→对联贴在门上。 上述情况表明,[A]式和[C]式之间有变换关系,[A]式可以变换[C]式。 (B)式和(D)式之间的变换 表示(B)义的[B]式“NPL + V + 着+ NP ”可以跟“NPL + 正在+ V + NP”句式(我们把它记为[D]式)相联系。例如: [B] →[D] 院子里演着梆子戏。院子里正在演梆子戏。

TEST语言语法分析,词法分析实验报告

编译原理实验报告 实验名称:分析调试语义分析程序 TEST抽象机模拟器完整程序 保证能用!!!!! 一、实验目的 通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法畴变换为中间代码的语义翻译方法。 二、实验设计

#include #include extern bool TESTparse(char *pFileName); extern int TESTScan(FILE *fin,FILE *fout); FILE *fin,*fout; //用于指定输入输出文件的指针 int main() { char szFinName[300]; char szFoutName[300]; printf("请输入源程序文件名(包括路径):"); scanf("%s",szFinName); printf("请输入词法分析输出文件名(包括路径):"); scanf("%s",szFoutName); if( (fin = fopen(szFinName,"r")) == NULL) { printf("\n打开词法分析输入文件出错!\n"); return 0;

} if( (fout = fopen(szFoutName,"w")) == NULL) { printf("\n创建词法分析输出文件出错!\n"); return 0; } int es = TESTScan(fin,fout); fclose(fin); fclose(fout); if(es > 0) printf("词法分析有错,编译停止!共有%d个错误!\n",es); else if(es == 0) { printf("词法分析成功!\n"); int es = 0; es = TESTparse(szFoutName); //调语法分析 if(es== true) printf("语法分析成功!\n"); else printf("语法分析错误!\n"); }

经典英语语法讲解解析

三天搞定英语语法 英语语法分为两个部分。一个部分是词法,即词的构成和词的使用规律。另一个部分是句法,即句子的组成和句子的使用方法。 英语语法的特点可以用三句话来表示:1、每个词都有词性;2、每句话都有动词(实意动词或系动词);3、每句话都必须符合五个基本句型。 三句话用一句话来说,就是,标出句中每一个单词的词性,找出句中所有动词,并标出其种类和相应的句子成分。理解,掌握,运用好这句话,按照一:词性;二:动词种类;三:动词相对应的句子成分;四:从句;五:非谓语动词方法就能透彻理解英语语法体系。 词的分类 词类又叫词性,英语单词根据其在句子中的功能,可以分成十个大类。 词类词义英语名称缩写形式例词中译 noun n. student 学生 1、名词表示人、事物、地点或抽象概念的名 称。 2、代词主要用来代替名词。pronoun pron. you 你 3、形容词表示人或事物的性质或特征。adjective adj. happy 高兴的 4、数词表示数目或事物的顺序。numeral num. three 三 5、动词表示动作或状态。verb v. cut 砍、割 adverb adv. quickly 迅速地 6、副词修饰动词、形容词或其他副词,说明时 间、地点、程度等。 7、冠词用在名词前,帮助说明名词。article art. a 一个 preposition prep. at 在... 8、介词表示它后面的名词或代词与其他句 子成分的关系。 9、连词用来连接词、短语或句子。conjunction conj. and 和 10、感叹词表示喜、怒、哀、乐等感情。interjection interj. Oh 哦 词性的分类: 修饰: 形容数冠代词名词 (red)(one)(a/the)(my)wood 1.名词 代替: 代词it 形容词the red 数词one

现代汉语语法特点

论现代汉语语法特点 现代汉语语法特点可以概括为如下: 首先,汉语是分析型语言,缺乏严格意义上的形态变化;其次,汉语是重语用的语言,语法跟语境的关系密切;最后汉语是重韵律的语言,节律对句法结构有制约作用。三个特点的关系是“一体二用”。特点是通过比较显示出来的。一般是拿汉语跟印欧语比较,也可以拿汉语跟其他汉藏语言比较,或将现代汉语与古代汉语比较。比较的基点不同,得到的特点便会不同。如果没有特别说明,各种文献讲的“现代汉语”一般是狭义的,即普通话,不包括方言,因为各方言与普通话还有一些不同。比如,我们讲汉语语序(包括语素序和词序)属偏正式,修饰语在前,中心语在后,如“公鸡、母鸡”,这是就普通话讲的,南方的一些方言说“鸡公、鸡母(鸡婆)”。如果不分方言和普通话,笼统地讲现代汉语语法的特点,很多方面是不好说清楚的。下面就详细的介绍现代汉语的语法特点。 (一)汉语是分析型语言,缺乏严格意义上的形态变化,即汉语是无形态标志和形态变化的语言。 由这个根本特点可以派生出以下特点: 1.形态标志和词形变化既不丰富,也不严格。印欧语系语言一般都有丰富的词形变化,也就是以词的形态变化为手段来表达各种语法意义,如数、性、格、时、体、态、级等。即使像现代英语这种形态变化已不十分丰富的语言,仍保留不少形态变化。下面以英语为参照点说明汉语词的形态特点。 名词、代词的数。英语可数名词、人称代词分单、复数,单数用零形式(不带标记的形式)表示,复数一般用附加词尾“-s”表示,如desk/desks、dog/dogs。也有用其他方式表示的,如foot/feet、man/men(内部屈折), I/we、me/us(异根)。甚至动词也有数,例如:He reads a book,表示动作的发出者是第三人称单数。动词的数是从属的,因为处于主语位置的名词或代词已经表明数的概念,主谓一致的要求使动词带上了数标志。汉语有数的观念,但没有严格的“数”的语法范畴。汉语表示数用数量词或与数量相关的词,如“一本书、十本书、一些书、很多书”,“书”本身形式上没有变化。表人的名词、代词可用后面加“们”的形式表示群体(大致相当于复数),如“人/人们、同志/同志们、青年/青年们、我/我们、它/它们”。

编译原理词法分析和语法分析报告 代码(C语言版)

词法分析 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 扫描子程序主要部分流程图 其他

词法分析程序的C语言程序源代码: // 词法分析函数: void scan() // 数据传递: 形参fp接收指向文本文件头的文件指针; // 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。 void scan() { char ch; int flag,j=0,i=-1; while(!feof(fp1)) { ch=fgetc(fp1); flag=judge(ch); printf("%c",ch);//显示打开的文件 if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;} else if(flag==4) {i++;buffer[i]='?';line[i]=row;} else if(flag==5) {i++;buffer[i]='~';row++;} else if(flag==7) continue; else cout<<"\n请注意,第"<

功能语法

扬州大学外国语学院 研究生学期作业 学期2008-2009第二学期 课程名称系统功能语法 学科专业 英语语言文学 研究生学号 M080336 研究生姓名 李岩

系统功能语法在外语教学中的应用 摘要:系统功能语法因其极强的科学性、客观性和实践性,其理论体系越来越多地被用于英语教学中。本文简单介绍了系统功能语法的含义,并阐明如何使用系统功能语法指导英语词汇、语法、阅读方面的教学。 关键词:系统功能语法;外语教学;应用 Abstract: Systemic-Functional Grammatics is generally applied in English teaching based on its scientific, objective and practical high level. This paper first give a overall introduction of Systemic-Functional Grammar, and then expounds the datailed application in English teaching of vocabulary, grammar and reading. 1.引言 语言与人类的社会实践分不开,系统功能语法把语言的实际使用作为研究对象,进一步制定了学派的理论体系, 并在应用过程中检验和完善理论。所以,系统功能语法具有极强的科学性、客观性和实践性,这一套理论体系也逐步被用于英语教学中。外语作为一种交流的工具,其教学要达到的目标不仅要培养学生的语言能力,更应注意培养学生的运用语言进行交际的能力。这与以韩礼德(M. A. K. Halliday)为代表的系统功能语法理论相一致。早在1982年,英国语言学家韩礼德便明确指出系统功能语言学理论的最大贡献在于将语言作为社会文化语境的有机组成部分予以研究,因此研究的重心不再是传统语言学所强调的词汇层面或句子层面的研究,而是以语篇为研究的基本单位,并进而从语篇与情景语境中揭示语言的性质与社会功能。系统功能语言学因其独到的功能主义和社会意义学视角,尤其是它对意义研究的重视,为越来越多的人所接受,同时也在语言教学以及其它人类社会活动领域取得了令人瞩目的成就。 2.系统功能语法概述 系统功能语法发源于以英国马利诺夫斯基(Malinowsky)和弗斯(Firth)等人为核心的伦敦学派。伦敦学派认为要从语言的用途和语境去探索语言。20世纪70年代初,弗斯的学生韩礼德(Halliday)在继承前人理论的基础上,从系统语法和功能语法两方面加以发展,形成了当今颇有影响的系统功能语法。系统功能语法是一门既研究语言系统又研究语言功能的语言学理论。系统功能语法理论包含了“系统语法”和“功能语法”两个部分。韩礼德把语言在人类的交际过程中所承担的各种各样的功能归结为三种纯理功能:概念功能、人际功能和语篇功能。韩礼德认为,语言是社会活动的产物。语言之所以是语言,是因为它要发挥一定的功能。换句话说,社会需求决定了语言的结构。因此,韩礼德把研究重点放在了语法的功能部分。功能语法把语言看作为一个交际系统,语法分析的目的在于发

现代汉语语法的五种分析方法

现代汉语语法的五种分析方法

现代汉语语法的五种分析方法 很有用,请好好学习之。 北语之声论坛专业精华转贴 现代汉语语法的五种分析方法是语法学基础里 很重要的一个内容,老师上课也会讲到,我在这 里把最简略的内容写在下面,希望能对本科生的专业课学习有所帮助 详细阐释中心词分析法、层次分析、变换分析法、语义特征分析法和语义指向分析的具体内涵:一. 中心词分析法: 分析要点: 1.分析的对象是单句; 2.认为句子又六大成分组成——主语、谓语(或述语)、宾语、补足语、形容词附加语(即定语)和副词性附加语(即状语和补语)。 这六种成分分为三个级别:主语、谓语(或述语)是主要成分,宾语、补足语是连 带成分,形容词附加语和副词性附加语是附加成分; 3.作为句子成分的只能是词; 4.分析时,先找出全句的中心词作为主语和谓

语,让其他成分分别依附于它们; 5.分析步骤是,先分清句子的主要成分,再决定有无连带成分,最后指出附加成分。 标记: 一般用║来分隔主语部分和谓语部分,用══标注主语,用——标注谓语,用~~~~~~标注宾语,用()标注定语,用[ ]标注状语,用< >标注补语。 作用: 因其清晰明了得显示了句子的主干,可以一下子把握住一个句子的脉络,适合于中小学语文教学,对于推动汉语教学语法的发展作出了很大贡献。 还可以分化一些歧义句式。比如:我们五个人一组。 (1)我们║五个人一组。(2)我们五个人║一组。 总结:中心词分析法可以分化一些由于某些词或词组在句子中可以做不同的句子成分而造成的歧义关系。 局限性: 1.在一个层面上分析句子,

层次性不强; 2.对于一些否定句和带有修饰成分的句子,往往难以划分; 如:我们不走。≠我们走。 封建思想必须清除。≠思想清除。 3. 一些由于句子的层次关系 不同而造成的歧义句子无法分析; 如:照片放大了一点儿。咬死了猎人的狗。 二. 层次分析: 含义: 在分析一个句子或句法结构时,将句法构造的层次性考虑进来,并按其构造层次逐层进行分析,在分析时,指出每一层面的直接组成成分,这种分析就叫层次分析。 朱德熙先生认为,层次分析不能简单地将其看作是一种分析方法,而是应当看做一种分析原则,是必须遵守的。(可以说说为什么) 层次分析实际包含两部分内容:一是切分,一是定性。切分,是解决一个结构的直接组成成分到底是哪些;而定性,是解决切分所得的直接组成成分之间在句法上是什么关系。

语法分析器实验报告

实验三语法分析器 一、实验目的: 理解和掌握LL(1)语法分析方法的基本原理;根据给出的LL(1)文法,掌握LL(1)分析表的构造及分析过程的实现,掌握语法分析方法和程序设计方法。 二、实验要求: 对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与。产生式结构几乎是一致的,通过设计、编程、调试出一个具体语法分析程序。 三、实验原理: 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。语法分析器的工作本质上是按文法的产生式,识别输入串是否是一个句子。自上而下分析法的主旨是,对任何输入串,试图用一切可能的方法,从文法开始符号出发,自上而下地为输入串建立一棵语法树。这种方法本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。 对于一个文法满足以下三个条件,则称该文法为LL(1)文法。 文法不含有左递归。 对于文法中的每一个非终结符A的各个产生式的侯选首符集两两不相交。即,若A->Q1|Q2|…|Qn 则FIRST(Qi) ^FIRST(Qj)=null (i!=j) 对文法中的每个非终结符号A,若他存在某个侯选首符集包含空串,则FIRST(A)^FOLLOW(A)=null 对于一个文法满足LL(1)条件时,我们就可以对其输入串进行有效的无回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符号。 四、实验步骤: 1、功能描述: 根据给定的文法,由程序生成项集族和语法分析表,对输入的源程序进行词法分析,得到语法分析的输入串,经过语法分析后得到三个栈,它们分别是状态栈,字符栈,输入栈,从而分析出输入的源程序是否有语法错误。 2、构造自己设计的小语言的语法分析器: (1) 语言的语法描述(语法规则)的设计即文法的设计; (2) 把文法形式符号中所隐含的信息内容挖掘出来并用LL或LR的资料形式(分析表)表示出来; (3) 语法分析的数据输入形式和输出形式的确定;

编译原理LL(1)语法分析实验报告

学号20102798 专业软件工程姓名薛建东 实验日期2013.04.08 教师签字成绩实验报告 【实验名称】LL(1)语法分析 【实验目的】 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练掌握开发应用程序的基本方法。 【实验内容】 ◆根据某一文法编制调试LL ( 1)分析程序,以便对任意输入的符号串进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1) 分析表,对输入符号串自上而下的分析过程。 【设计思想】 (1)、LL(1)文法的定义 LL(1)分析法属于确定的自顶向下分析方法。LL(1)的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。 LL(1)文法的判别需要依次计算FIRST集、FOLLOW集和SELLECT集,然后判断是否为LL(1)文法,最后再进行句子分析。 需要预测分析器对所给句型进行识别。即在LL(1)分析法中,每当在符号栈的栈顶出现非终极符时,要预测用哪个产生式的右部去替换该非终极符;当出现终结符时,判断其与剩余输入串的第一个字符是否匹配,如果匹配,则继续分析,否则报错。LL(1)分析方法要求文法满足如下条件:对于任一非终极符A的两个不同产生式A→α,A→β,都要满足下面条件:SELECT(A→α)∩SELECT(A→β)=? (2)、预测分析表构造 LL(1)分析表的作用是对当前非终极符和输入符号确定应该选择用哪个产生式进行推

系统语法和功能语法

4.3系统语法 在系统语法巾,系统的概念是由一条基本的解释性原则构成的,语言被认为是“系统的系统”(system of systems)。系统语法试图建立各种相互关联的系统的网络,从而解释在语言中各种与语义相关的选择。 笼统地讲,系统中存在链锁系统(chain system)和选择系统(choice system):轴 一个系统为我们提供了两个或两个以上的选项。例如,我们可以在包括过去时和非过去时两个选项的时态系统中进行选择。我们还可以在非过去时这个子系统中进一步进行选择,即选择现在时或是将来时。 过去时 时态{ 现在时 、非过去时{将来时 韩礼德的系统语法与其他语言学家的理论有所不IN,主要体现在以下几个方面:(1)系统语法十分重视语言的社会学特征。(2)系统语法认为语言是“做事”的一种手段,而不是“知识”的表现形式。它区分了“语言行为潜势??和“实际语言行为”。(3)系统语法非常重视对个别语言以及个别变体的描写。(4)系统语法用“连续体”这一概念来解释众多语言现象(例如:不符合语法的——反常——一不太反常一一不太惯常一符合语法)。(5)系统语法依靠对各种文本的观察和统计学的手段来验证自己的假设。(6)系统语法把“系统”范畴作为基本范畴。 由于语言现象十分复杂,所以很难进行精确的分析。语言学家试图将语言分成不同范畴以便于分析,但是在实际操作中最终发现这些范畴之间的界限并不清晰。一些语言现象可以很容易地被划分到某个范畴中去,但是还有很多语言现象很难判断是属于哪个范畴的。这些范畴的界限十分模糊,而且一个范畴与其他范畴常有重叠之处。研究系统语法的语言学家非常重视语言的这种模糊性,他们认为引人c·渐变,,(cline)的概念有利于更好的描述语言的这种特性。但是,在分析语言现象时,我们必须假设在语言这个渐变体上存在着明确的界点,这样我们才可以把某种语言现象归人某个范畴中去。 一个系统就是一组选择项,即使是特定系统中的项目也有其共同之处,它们

人教版八年级下册英语语法解析知识重点总结

新目标英语八年级(下)重点短语及句型总 Unit 1 Will people have robots? 1. fewer people 更少的人(fewer 修饰名词复数,表示否定) 2. less free time 更少的空闲时间(less 修饰不可数名词,表示否定) 3. in ten years 10年后(in 的时间短语用于将来时,提问用How soon) 4. fall in love with … 爱上…… 例:When I met Mr. Xu for the first time, I fell in love with him at once. 当我第一次见到许老师,我立刻爱上他。 5. live alone 单独居住 6. feel lonely 感到孤独(比较:live alone/ go alone 等) The girl walked alone along the street, but she didn't feel lonely. 那女孩独自沿着街道走,但她并不感到孤独。 7. keep/ feed a pet pig 养一头宠物猪 8. fly to the moon 飞上月球 9. hundreds of + 复数数百/几百(概数,类似还有thousands of; millions of) 10. the same as 和……相同 11. A be different from B A与B不同 (= There is a difference/ Thgere are differences between A and B) 12. wake up 醒来(wake sb. up 表示“唤醒某人”) 13. get bored 变得厌倦(get/ become 是连系动词,后跟形容词如tired/ angry/ excited 等) 14. go skating 去滑冰(类似还有go hiking/ fishing / skating/ bike riding 等) 15. lots of/ a lot of 许多(修饰可数名词、不可数名词都可以) 16. at the weekends 在周末 17. study at home on computers 在家通过电脑学习 18. agree with sb. 同意某人(的意见) 19. I don't agree. = I disagree. 我不同意。 20. on a piece of paper 在一张纸上 (注意paper/ information/ news/ work/ homework/ housework 等常考到的不可数名词) 21. on vacation 度假 22. help sb with sth/help sb do sth. 帮助某人做某事

相关文档
相关文档 最新文档