使用javacc实现语法生成器(基于miniC语法)

			/********* 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>
}

猜你喜欢

转载自blog.csdn.net/did_you/article/details/78710307
今日推荐