千家信息网

Java LPAREN怎么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"Java LPAREN怎么用"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Java LPAREN怎么用"文章能帮助大家解决问题。为了让词法分
千家信息网最后更新 2026年11月01日Java LPAREN怎么用

这篇文章主要介绍"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怎么用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

文法 符号 过程 时候 词法 分析 不同 两个 就是 知识 表达式 函数 同时 格式 正则 行业 记号 复杂 实用 例子 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网加科技 互联网科技网 科技类互联网 广州互联网科技公司 中国互联网科技发展 互联网科技的英文 安徽鑫晟辉互联网科技 佛山市翊博互联网络科技有限公司 互联网在线教育科技创业 佛山市拉法互联网科技有限公司 明优互联网科技有限公司 烟台灵鸽互联网科技有限公司 中天科技中国工业互联网 美国互联网科技公司 山东大美朱楼互联网科技有限公司 湖北辰鑫科技互联网 广州三三互联网科技有限公司 互联网的科技体现在哪里 恒生科技指数 中概互联网 互联网领先科技成果宣传视频 苏州找大状互联网科技有限公司 科技赋能互联网健康 互联网教育科技公司vipkid 互联网经济与金融科技 速维有品互联网信息科技(苏州)有限公司 中国科技创新与世界互联网大会 互联网公司高科技产品 富国互联网科技002692 东营紫格互联网科技 山东亿川互联网科技有限责任公司
0