将解析器中的标记与哈希表上的调用方法进行比较
comparing tokens in parser to call method on a hashtable
我正在使用 javacc 为编程语言开发解析器和扫描器。现在我正在尝试确定什么会为变量赋值。创建新变量时,像这样:
hello = 5
5 的值保存在散列table 上,并且工作得很好。使用函数,我获取变量及其值并将其放入 table.
然而,当我尝试为一个变量分配另一个现有变量时:
hello = 5
bye = hello
我会使用另一种方法首先检查哈希中是否已经存在 hellotable。如果是 bye,则赋值为 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);
}
}
任何帮助将不胜感激,谢谢!
我不认为真的有两种情况。如果您的语言与大多数语言一样,一种表达式就是变量。 IE。您的 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);
}
}
我正在使用 javacc 为编程语言开发解析器和扫描器。现在我正在尝试确定什么会为变量赋值。创建新变量时,像这样:
hello = 5
5 的值保存在散列table 上,并且工作得很好。使用函数,我获取变量及其值并将其放入 table.
然而,当我尝试为一个变量分配另一个现有变量时:
hello = 5
bye = hello
我会使用另一种方法首先检查哈希中是否已经存在 hellotable。如果是 bye,则赋值为 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);
}
}
任何帮助将不胜感激,谢谢!
我不认为真的有两种情况。如果您的语言与大多数语言一样,一种表达式就是变量。 IE。您的 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);
}
}