【问题标题】:comparing tokens in parser to call method on a hashtable将解析器中的标记与哈希表上的调用方法进行比较
【发布时间】:2017-03-10 02:15:36
【问题描述】:

我正在使用 javacc 为编程语言开发解析器和扫描器。现在我正在尝试确定将值分配给变量的内容。创建新变量时,如下所示:

hello = 5

5 的值保存在哈希表中,而且效果很好。使用函数,我将变量及其值放入表中。

但是,当我尝试为一个变量分配另一个现有变量时:

hello = 5
bye = hello

我会使用另一种方法首先检查 hello 是否已存在于哈希表中。如果是 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);
    }
}

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 如果您打算在将来的任何时候支持循环,您会发现在同一遍中解析和评估不是一个好主意。原因是您希望解析循环一次,但执行多次。如果您打算支持子例程,则类似的推理。最好有一个解析过程来创建某种中间代码,然后有一个解释过程来解释(即执行)该中间代码。中间代码的典型选择包括:抽象语法树和虚拟机的机器代码。

标签: java token javacc


【解决方案1】:

我不认为真的有两种情况。如果您的语言与大多数语言一样,那么一种表达式就是变量。 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);
    }
}  

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 2019-03-03
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2015-05-13
    相关资源
    最近更新 更多