文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java LPAREN怎么用

2023-06-03 04:15

关注

这篇文章主要介绍“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 AddopTerm Addop Term Addop Term …而Addop也就相当于PLUS和MINUS两个运算符号。这里我们在写Expression的文法的时候,同时还使用了赋值表达式,因为这个和Yacc不同的时候,Javacc把文法识别完全地做到了函数过程中,那么如果我们要识别Simple_Expression的文法,就相当于按顺序识别Term和Addop两个文法,而识别那个文法,就相当于调用那两个非终结符的识别函数。正是这一点,我觉得Javacc的文法识别处理上就很接近程序的操作过程,我们不需要像YACC那样使用严格的文法表示格式,复杂的系统参数了。

关于“Java LPAREN怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯