⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmm.jjt

📁 使用yacc和lex编写的cmm语言的词法分析和语法分析程序.
💻 JJT
字号:
options {
  JAVA_UNICODE_ESCAPE = true;
  NODE_PREFIX = "AST";
  MULTI = true;
  NODE_DEFAULT_VOID = true;
}
 
PARSER_BEGIN(Cmm) 

public class Cmm {
  public static void main(String args[]) {
    System.out.println("Reading from standard input...");
    System.out.print("");
    new Cmm(System.in);
    try {
      SimpleNode n = Cmm.Start();
      n.dump("");
      System.out.println("Successful!");
    } catch (Exception e) {
      System.out.println("Oops,got an error!");
      System.out.println(e.getMessage());
    }
  }
}
PARSER_END(Cmm)

SKIP :
{
  " "
| "\t"
| "\n"
| "\r"
}

TOKEN:
{
	<LPAREN:"(">
|	<RPAREN:")">
|	<LBRACE:"{">
|	<RBRACE:"}">
|	<LBRACKET:"[">
|	<RBRACKET:"]">
|	<SEMICOLON:";">
|	<COMMA:",">
|	<DOT:".">
}

TOKEN:
{
	<PLUS:"+">
|	<MINUS:"-">
|	<TIMES:"*">
|	<DIVIDE:"/">
|	<ASSIGN:"=">
|	<GT:">">
|	<LT:"<">
|	<EQ:"==">
|	<LE:"<=">
|	<GE:">=">
|	<NE:"!=">
}

TOKEN:
{
	<INT:"int">
|	<REAL:"real">
|	<CONST:"const">
|	<WHILE:"while">
|	<READ:"read">
|	<WRITE:"write">
|	<IF:"if">
|	<ELSE:"else">	
|	<PROGRAM:"Program">
}

TOKEN :
{
	<#DIGIT:["0"-"9"]>
|	<#LETTER:["a"-"z","A"-"Z"]>
|	<UNDERLINE:"_">
|	<IDENTIFIER:<LETTER>(<DIGIT>|<LETTER>|<UNDERLINE>)*>
|	<INTNUMBER:<DIGIT>(<DIGIT>)*>
|	<REALNUMBER:(<DIGIT>)*<DOT><DIGIT>(<DIGIT>)*|<DIGIT>(<DIGIT>)*<DOT>(<DIGIT>)*>	
}

/* ************************************************************
*    叶子节点
************************************************************ */

/*
  * 变量类型
  */
void Type() #Type:{
	Token t;
}
{
	(t = <INT>|t = <REAL>)
	{
		jjtThis.setValue(t.image);
	}
}


/*
  * 加好减号
  */
void AddOp() #AddOp:{
	Token t;
}
{
	(t = <PLUS> | t = <MINUS>) 
	{
		jjtThis.setValue(t.image);
	}
}

/*
  * 乘号除号
  */
void MultOp() #MultOp:{
	Token t;
}
{
	(t = <TIMES> | t = <DIVIDE>) 
	{
		jjtThis.setValue(t.image);
	}
}

/*
  * 等号
  */
void AssignOp() #AssignOp:{
	Token t;
}
{
	t = <ASSIGN>
	{
		jjtThis.setValue(t.image);
	}
}

/*
  * 关系运算符
  */
void RelationOp() #RelationOp:{
	Token t;
}
{
	(t = <EQ>|t =<NE>|t =<GT>|t =<LT>|t =<GE>|t =<LE>)
	{
		jjtThis.setValue(t.image);
	}
}

/*
  * 标识符
  */
String Identifier()#Identiifer:{
	Token t;
}
{
	t=<IDENTIFIER>
	{
		jjtThis.setValue(t.image);
		return t.image;
	}
}

/*
  * 数字
  */
String Number()#Number:{
	Token t;
}
{
	(t = <INTNUMBER> | t = <REALNUMBER>)
	{
		jjtThis.setValue(t.image);
		return t.image;
	}
}

/*
  * 逗号
  */
void Comma()#Comma:{
	Token t;
}
{
	t = <COMMA>
	{
		jjtThis.setValue(t.image);
	}
}

/*
  * 分号
  */
void Semicolon() #Semicolon:{
	Token t;
}
{
	t = <SEMICOLON>
	{
		jjtThis.setValue(t.image);
	}
}

/*
  * 中括号
  */
void Bracket()#Bracket:{
	Token t;
}
{
	( t = <LBRACKET> | t = <RBRACKET> )
	{
		jjtThis.setValue(t.image);
	}
}

/*
  * 大括号
  */
void Brace()#Brace():{
	Token t;
}
{
	( t = <LBRACE> | t = <RBRACE>)
	{
		jjtThis.setValue(t.image);
	}
}

/* ************************************************************
*   中间节点
************************************************************ */
/*
  * 开始
  */
SimpleNode Start()#Start:{}
{
	Program()<EOF>
	{ return jjtThis; }
}

/*
  * 赋值语句
  */
void AssignStatement()#AssignStatement:{}
{
	(
		 Identifier() (Bracket()Expression()Bracket())*
		 AssignOp() Expression() 
	)
	Semicolon()
}

/*

  * 因子
  */
void Factor():{}
{
	Identifier()
|	Number()
|	<MINUS>Factor()
|	<LPAREN>Expression()<RPAREN>	
}

/*
  * 项
  */
void Item():{}
{
	Factor()
	(
		MultOp() Factor()
	)*
}

/*
  * 表达式
  */
void Expression():{}
{
	Item()
	(
		AddOp()
		Item()
	)*
}

/*
  * 常量定义
  */
void ConstDefinition():{}
{
	Identifier() AssignOp() Number()
}

/*
  * 常量声明
  */
void ConstDeclaration() #CONST:{}
{
	(
		<CONST> Type() ConstDefinition() (Comma() ConstDefinition())*
	)
	Semicolon()
}

/*
  * 变量声明
  */
void VarDeclaration()#VarDeclaration:{}
{
	Type()
	VarDeclarationId() [ AssignOp() VarInitializer() ]
	Semicolon()
}

/*
  * 变量声明ID
  */
void VarDeclarationId():{}
{
	Identifier() (Bracket() Bracket())*
}

/*
  * 变量初始化
  */
 void VarInitializer():{}
 {
 	ArrayInitializer()
|	Expression() 	
 } 
 
 /*
  * 数组初始化
  */
void ArrayInitializer():{}
{
	Brace() [ VarInitializer() ( LOOKAHEAD(2) <COMMA> VarInitializer())*] Brace()
}

/*
  * 条件
  */
void Condition():{}
{
	Expression() RelationOp()  Expression()
}

/*
  * 条件语句
  */
void ConditionStatement()#IF:{}
{
	<IF><LPAREN>Condition()<RPAREN> Statement() 
	(LOOKAHEAD(2)<ELSE><IF><LPAREN>Condition()<RPAREN> Statement())* 
	[ LOOKAHEAD(2)<ELSE> Statement() ]
}

/*
  * While语句
  */
void WhileStatement()#WHILE:{}
{
	<WHILE><LPAREN>Condition()<RPAREN>
		Statement()
}

/*
  * Read语句
  */
void ReadStatement()#READ:{}
{
	<READ><LPAREN>Identifier()(Comma()Identifier())*<RPAREN>Semicolon()
}

/*
  * Write语句
  */
void WriteStatement()#WRITE:{}
{
	<WRITE><LPAREN>Expression()(Comma()Expression())*<RPAREN>Semicolon()
}

/*
  * 复合语句
  */
void CompoundStatement()#CompoundStatement:{}
{
	<LBRACE>Statement() (Statement())*<RBRACE>
}

/*
  * 语句
  */
void Statement():{}
{
	AssignStatement()
|	ConditionStatement()
|	WhileStatement()
|	ReadStatement()
|	WriteStatement()
|	CompoundStatement()	
}

/*
  * 程序
  */
void Program():{}
{
	(ConstDeclaration())*	
	(VarDeclaration())* 
	(Statement())*
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -