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

来源:互联网 发布:简单无线mesh网络搭建 编辑:程序博客网 时间:2024/06/05 06:45
/********* 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 blocke1.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>}