/********* WRITEN BY ZZG *********/
/******** DATE: 12,4,2017 ********/
/**
* JJTree template file created by SF JavaCC plugin 1.5.28+ wizard for JavaCC 1.5.0+
*/
options
{
static = true;
}
PARSER_BEGIN(MyNewGrammar)
package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class MyNewGrammar
{
public static void main(String args [])
{
FileInputStream fileStream;
try {
fileStream = new FileInputStream("test.c");
MyNewGrammar parser = new MyNewGrammar(fileStream);
System.out.println("Reading from file ...");
try {
SimpleNode rootNode = parser.Start();
rootNode.dump(" ");//抓取返回的語法樹。
} catch (Exception e) {
System.out.println("NOK.");
System.out.println(e.getMessage());
} catch (Error e) {
System.out.println("Oops.");
System.out.println(e.getMessage());
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
PARSER_END(MyNewGrammar)
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
| < "//" (~[ "\n", "\r" ])*
(
"\n"
| "\r"
| "\r\n"
) >
| < "/*" (~[ "*" ])* "*"
(
~[ "/" ] (~[ "*" ])* "*"
)*
"/" >
}
TOKEN :
{
< CONSTANT: ( <DIGIT> )+ >
| < DIGIT: ["0" - "9"] >
}
TOKEN : /* LITERALS */
{
< INTEGER_LITERAL :
< DECIMAL_LITERAL > ([ "l", "L" ])?
| < HEX_LITERAL > ([ "l", "L" ])?
| < OCTAL_LITERAL > ([ "l", "L" ])?
>
| < #DECIMAL_LITERAL : [ "1"-"9" ] ([ "0"-"9" ])* >
| < #HEX_LITERAL : "0" [ "x", "X" ] ([ "0"-"9", "a"-"f", "A"-"F" ])+ >
| < #OCTAL_LITERAL : "0" ([ "0"-"7" ])* >
}
TOKEN : /* KEYWORDS */
{
< MAIN : "main">
| < INT : "int">
| < VOID : "void">
| < IF:"if">
| < ELSE:"else" >
| < WHILE:"while" >
| < FOR:"for" >
| < RETURN:"return">
}
TOKEN : /* OPERATORS */
{
< PLUS:"+">
| < MINUS:"-">
| < MULTIPLY:"*">
| < DIVIDE:"/">
| < ASSIGN:"=">
}
TOKEN : /* RELATIONSHIPOPERATOR */
{
< LT:"<" >
| < LE:"<=" >
| < GT:">" >
| < GE:"=>" >
| < EQ:"==" >
| < NE:"!=" >
}
TOKEN : /* IDENTIFIERS */
{
< IDENTIFIER :
< LETTER >
(
< LETTER >
| < DIGIT >
)* >
| < #LETTER : [ "_", "a"-"z", "A"-"Z" ] >
}
TOKEN:
{
<LC:"(">
| <RC:")">
| <LM:"[">
| <RM:"]">
| <LB:"{">
| <RB:"}">
}
SimpleNode Start() :
{}
{
Expression()
{
return jjtThis;
}
}
void Expression() :
{}
{
< INT >< MAIN >< LC >< RC >< LB > MainStatement() < RB >
}
void MainStatement():{}
{
Statement()//|(MainStatement())*
}
void Statement(): { }
{
(
SequenceStatement() //順序語句
| IfStatement() //條件語句
| While() //循環語句
)*
}
//順序
void SequenceStatement(): { }
{
(declaration()|copy()) ";" //聲明和賦值
}
void declaration() : { }
{
//(< INT> < IDENTIFIER> )
(< INT> < IDENTIFIER> ("," < IDENTIFIER >)* < ASSIGN>< CONSTANT> )
}
void copy(): { }
{
< IDENTIFIER>< ASSIGN> (< CONSTANT>|< IDENTIFIER>)
}
//條件
void IfStatement():{}
{
< IF>< LC>Condition()< RC>< LB>(assign() ";")< RB> ElseStatement()
}
void ElseStatement(): { }
{
< ELSE> (< LB> assign() ";" < RB>)|IfStatement()
}
void assign(): { }
{
< IDENTIFIER>< ASSIGN>(< CONSTANT>|< IDENTIFIER>)
}
void Condition() :{ }
{
expression() (
< LT> expression()|
< LE> expression()|
< GT> expression()|
< GE> expression()|
< EQ> expression()|
< NE> expression()
)
}
void expression(): { }
{
term()((< PLUS >|< MINUS > term()))*
}
void term(): { }
{
unary()(( < MULTIPLY >|< DIVIDE> ) unary())*
}
void unary() :{ }
{
< IDENTIFIER> | < CONSTANT>|< LC>expression()< RC>
}
//循環
void While():{}
{
< WHILE>< LC>Condition()< RC>< LB>(copy()";")< RB>
}
使用javacc實現語法生成器(基於miniC語法)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.