JavaCC之JJTree中如何获得终结符内容

夏黑26 2010-04-18 04:55:58
现有一个.jjt文件,其中有两类Token:Integer和Identifier。
实现功能:如输入1+2;输出结果为:
Add
Integer
Integer

如输入1+val;输出结果为:
Add
Integer
Identifier

现在想要实现用token中的内容(token.image)来代替token当输入1+2;时,输出为:
Add
1
2

查了一些资料,说添加动作{jjtThis.name=t.image}课实现,我照做了,但提示说没有属性name,我就加了String name;不提示出错了,但输出结果和原来一样!是我String name;加的位置不对还是怎么回事?我分别在SimpleNode.java中和SimpleNode Program() :
{

}
{
Expression() ";"
{ return jjtThis; }
}
中都试了,都不行。

jjt文件源码如下:

options {
MULTI=true;
KEEP_LINE_COLUMN = false;
}

PARSER_BEGIN(Eg2)
package TestJJT.eg2;

/** An Arithmetic Grammar. */
public class Eg2 {

/** Main entry point. */
public static void main(String args[]) {
System.out.println("Reading from standard input...");
Eg2 t = new Eg2(System.in);
try {
ASTStart n = t.Start();
n.dump("");
System.out.println("Thank you.");
} catch (Exception e) {
System.out.println("Oops.");
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}

PARSER_END(Eg2)


SKIP :
{
" "
| "\t"
| "\n"
| "\r"
| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")>
| <"/*" (~["*"])* "*" (~["/"] (~["*"])* "*")* "/">
}

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 : /* IDENTIFIERS */
{
< IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
|
< #LETTER: ["_","a"-"z","A"-"Z"] >
|
< #DIGIT: ["0"-"9"] >
}

/** Main production. */
ASTStart Start() :
{ String name; }
{
Expression() ";"
{ return jjtThis; }
}

/** An Expression. */
void Expression() #void : {}
{
AdditiveExpression()
}

/** An Additive Expression. */
void AdditiveExpression() #void : {}
{
(
MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )*
) #Add(>1)
}

/** A Multiplicative Expression. */
void MultiplicativeExpression() #void : {}
{
(
UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )*
) #Mult(>1)
}

/** A Unary Expression. */
void UnaryExpression() #void : {}
{
"(" Expression() ")" | MyID() | Integer()
}

/** An Identifier. */
void MyID() :
{
Token t;
}
{
t=<IDENTIFIER>
{
jjtThis.name=t.image;
}
}

/** An Integer. */
void Integer() :
{ Token t; }
{
t=<INTEGER_LITERAL>
{
jjtThis.val = Integer.parseInt(t.image);
}
}
...全文
106 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZangXT 2010-04-18
  • 打赏
  • 举报
回复
好高级的东东,没玩过。
夏黑26 2010-04-18
  • 打赏
  • 举报
回复
已搞定!
夏黑26 2010-04-18
  • 打赏
  • 举报
回复

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧