91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java LPAREN怎么用

發布時間:2022-01-17 16:15:32 來源:億速云 閱讀:213 作者:iii 欄目:編程語言

這篇文章主要介紹“Java LPAREN怎么用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java LPAREN怎么用”文章能幫助大家解決問題。

為了讓詞法分析做得更簡單,我們通常都不會在文法分析的時候,使用“(”,“)”等字符號串來表示終結符號,而需要轉而使用LPAREN, RPAREN這樣的整型符號來表示。

PARSER_BEGIN(Grammar)
public class Grammar implements NodeType {
   public ParseTreeNode GetParseTree(InputStream in) throws ParseException
   {
       Grammar parser =new Grammar(in);
       return parser。Expression();
   }
}
PARSER_END(Grammar)
SKIP :
{
   " " | " " | " " | ""
}
TOKEN :
{
   < ID: ["a"-"z","A"-"Z","_"> ( ["a"-"z","A"-"Z","_","0"-"9"> )* >
 | < NUM: ( ["0"-"9"> )+ >
 | < PLUS:   "+" >
 | < MINUS:  "-" >
 | < TIMERS: "*" >
 | < OVER:   "/" >
 | < LPAREN: "(" >
 | < RPAREN: ")" >
}

ParseTreeNode Expression() :
{
   ParseTreeNode ParseTree = null;
   ParseTreeNode node;
}
{
   ( node=Simple_Expression()
       {
           if(ParseTree == null)
               ParseTree =node;
           else
           {
               ParseTreeNode t;
               t= ParseTree;
               while(t.next != null)
                   t=t.next;
               t.next = node;
           }
       }
   )*
   { return ParseTree; }
   


}
ParseTreeNode Simple_Expression() :
{
   ParseTreeNode node;
   ParseTreeNode t;
   int op;
}
{
   node=Term(){}
   (
       op=addop() t=Term()
       {
           ParseTreeNode newNode = new ParseTreeNode();
           newNode.nodetype = op;
           newNode.child[0] = node;
           newNode.child[1] = t;
           switch(op)
           {
               case PlusOP:
                   newNode.name = "Operator: +";
                   break;
               case MinusOP:
                   newNode.name = "Operator: -";
                   break;
           }
           node = newNode;
       }
   )*
   { return node; }
}
int addop() : {}
{
   { return PlusOP; }
 |{ return MinusOP; }
}
ParseTreeNode Term() :
{
   ParseTreeNode node;
   ParseTreeNode t;
   int op;
}
{
   node=Factor(){}
   (
       op=mulop() t=Factor()
       {
           ParseTreeNode newNode = new ParseTreeNode();
           newNode.nodetype = op;
           newNode.child[0] = node;
           newNode.child[1] = t;
           switch(op)
           {
               case TimersOP:
                   newNode.name = "Operator: *";
                   break;
                   case OverOP:
                   newNode.name = "Operator: /";
                   break;
           }
           node = newNode;
       }
   )*
   {
       return node;
   }
}
int mulop() :{}
{
   { return TimersOP; }
 |{ return OverOP;   }
}
ParseTreeNode Factor() :
{
   ParseTreeNode node;
   Token t;
}
{
   t=
   {
       node=new ParseTreeNode();
       node.nodetype= IDstmt;
       node.name = t.image;
       return node;
   }
   |
   t=
   {
       node=new ParseTreeNode();
       node.nodetype= NUMstmt;
       node.name = t.image;
       node.value= Integer.parseInt(t.image);
       return node;
   }
   |
   node=Simple_Expression()
   {
       return node;
   }
}

   其中SKIP中的定義就是在進行詞法分析的同時,忽略掉的記號。TOKEN中的,就是需要在做詞法分析的時候,識別的詞法記號。當然,這一切都是以正則表達式來表示的。
   這個例子就有多個非終結符號,可以看出,我們需要為每個非終結符號寫出一個過程。不同的非終結符號的識別過程中可以互相調用。

   以Simple_Expression()過程為例,它的產生式是Expression -> Term { addop Term },而在javacc的輸入文件格式是,它的識別是這樣寫的node=Term(){} ( op=addop() t=Term(){ … })* 前面說過,這里的”*”符號和正則表達式是一樣的,就是0次到無限次的重復。那么Simple_Expression等于文法Term Addop Term Addop Term Addop Term … 而Addop也就相當于PLUS和MINUS兩個運算符號。這里我們在寫Expression的文法的時候,同時還使用了賦值表達式,因為這個和Yacc 不同的時候,Javacc把文法識別完全地做到了函數過程中,那么如果我們要識別Simple_Expression的文法,就相當于按順序識別Term 和Addop兩個文法,而識別那個文法,就相當于調用那兩個非終結符的識別函數。正是這一點,我覺得Javacc的文法識別處理上就很接近程序的操作過 程,我們不需要像YACC那樣使用嚴格的文法表示格式,復雜的系統參數了。

關于“Java LPAREN怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广州市| 濉溪县| 河池市| 临海市| 太康县| 雅江县| 墨竹工卡县| 滨海县| 孙吴县| 霍邱县| 丰城市| 鹤壁市| 东乡县| 灵石县| 巴楚县| 贵定县| 无棣县| 闻喜县| 阿图什市| 鹤庆县| 武清区| 全南县| 正安县| 探索| 文安县| 松原市| 阿拉善盟| 射阳县| 正蓝旗| 内丘县| 栾城县| 尼玛县| 永福县| 白山市| 桃园市| 老河口市| 苏尼特右旗| 安新县| 盐亭县| 石台县| 民勤县|