我正在使用javacc编写解析器和扫描程序来编程语言。现在我正在尝试建立将值赋给变量的内容。创建新变量时,如下所示:
hello = 5
5的值保存在哈希表上,并且完全正常。使用函数我获取变量及其值并将其放在表中。
但是当我尝试为变量分配另一个现有变量时:
hello = 5
bye = hello
我将使用另一种方法来首先检查哈希表中是否已存在hello。如果它的再见被赋值为5,如果没有,则会输出错误信息。
在我的.jj文件上 我对第一种情况有以下代码:
void Assign() : { Token var; int value;}
{
var = <TK_ID>
<TK_EQ>
value = Exp()
{
TableVariables.assignValue(var,value);
}
}
TK_ID是给出变量名称的标记
TK_EQ是=
的标记Exp()是一种允许任何类型的数值表达式为值
的方法我想做什么,不知道如何:
if (var = value)
TableVariables.assignValue(var,value);
else if (var = var2)
TableVariables.assignID(var,var2);
这就是assignValue的样子:
public static void assignValue(Token id, int value) {
table.put(id.image, value);
}
以及assignID的样子:
public static void assignID(Token id, Token id2) {
if(table.containsKey(id2.image)) {
table.put(id.image, (Integer)table.get(id2.image));
}
else {
System.out.println("Error " + id2.image + " does not exist");
}
}
我试图这样做,但它不起作用:
void Assign() : { Token var; Token var2; int value;}
{
var = <TK_ID>
<TK_EQ>
value = Exp()
{
TableVariables.assignValue(var,value);
}
|
var = <TK_ID>
<TK_EQ>
var2 = <TK_ID>
{
TableVariables.assignID(var,var2);
}
}
任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
我认为实际上并不存在两种情况。如果您的语言与大多数语言类似,那么一种表达式就是变量。即你的Exp
非终结者看起来像是:
int Exp() :{
Token t;
int value;}
{
t = <TK_ID>
{
Integer v = TableVariables.getValue(t.image) ;
if( v == null ) {
reportError( "Uninitialized variable "+ t.image ) ;
return 0 ;
else {
return v.intValue() ; }
}
|
t = <TK_INT_LITERAL>
{ return Integer.parseInt( t.image, 10) ; }
|
...
}
然后你的赋值语句可以作为一个案例处理这两种情况,就像你有
一样void Assign() : { Token var; int value;}
{
var = <TK_ID>
<TK_EQ>
value = Exp()
{
TableVariables.assignValue(var,value);
}
}