📄 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 + -