2017-03-10 40 views
0

我正在使用javacc編程語言的解析器和掃描器。現在我試圖建立將變量分配給值的東西。當創建一個新變量時,如下所示:比較分析器中的標記以在哈希表上調用方法

hello = 5 

5的值保存在哈希表中,並且工作得很好。用一個函數,我把這個變量和它的值放在表格中。

然而,當我嘗試分配一個變量另一個現有變量:

hello = 5 
bye = 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); 
    } 
}