簡體   English   中英

訪問者的antlr4切換語句語法

[英]antlr4 switch statement grammar to visitor

作為編程社區中的許多人,我還嘗試為Java的學校項目構建自己的編程語言。 我將intlij與antlr4一起使用,因為在編寫測試代碼的同時,它有助於生成樹。 我創建了一個訪問者類,以向代碼中添加功能,到目前為止,我能夠做出if / else語句和while語句。 因此,我還想創建一個switch語句並將其實現到visitor類。 我對switch語句的語法如下:

switch_rule: SWITCH LPAREN any_var RPAREN LBRACKET case_rule* RBRACKET;

case_rule:  CASE any_var PRES statement;

statement:
    expression
    | rule_ifset
    | rule_for
    | method_call
    | rule_whiledo
    | rule_dowhile
    | switch_rule
    | assign
    |var_declaration;

any_var :INT              # NumericConst
        | DOUBLE           # NumericConst
        | IDENTIFIER       # NumericVariable
        |boolean_var      # BooleanConst;

所以我假設我是這樣啟動方法的:

@Override
public InputValue visitSwitch_rule(AdamantParser.Switch_ruleContext ctx) {
    InputValue value = this.visit(ctx.any_var().getChild(0));
    if(!value.isInteger()){throw new RuntimeException("switch value is not an integer");}
    else{
           //code to write here
    }

    return InputValue.VOIDval;
}

我想在switch方法中編寫case語句,但是我不知道如何從這里開始,也沒有找到任何簡單的示例...任何人都可以指向正確的方向或提供一些簡單的代碼嗎? 提前致謝。

編輯:我想要的語法的一個簡單的示例如下:

switch(aNumber){
   case 1: print("return 1");
   case 2: print("return 2");
}

從您的評論看來,您正在編寫一個解釋器,該解釋器直接在訪問者中執行代碼,而無需經過任何IR或類似的操作(如果我誤解了,請糾正我)。

因此,您的問題是,即使您甚至不知道會有多少個case語句,也不能只在代碼內編寫一個switch語句-畢竟不能將一個case放入循環中。 即使這不是問題,另一個問題是case語句需要編譯時常量,但是您需要將其與從解析樹中提取的值一起使用。

如果您正在生成代碼,那么這都不是問題,因為您可以使用給定的值生成適當數量的案例,並且一切都會很好。 但是您不是,所以一切都是動態的,您不能使用switch

但是,因為沒有人說你必須執行,這不是一個問題, switch使用switch 您可能知道,切換只是編寫一系列if語句的一種更方便(而且通常更具性能)的方式。 在您的示例中(假設您的語言包含隱含的break ),則為:

if (aNumber == 1) {
    print("return 1");
} else if (aNumber == 2) {
    print("return 2");
}

這對您的解釋器意味着您可以評估要打開的表達式,然后循環遍歷所有個案,並針對每種個案將評估的數字與case值進行比較,並使用if 一旦條件之一匹配,就執行關聯的代碼並退出循環。

如果沒有隱含的break ,則應該只在遇到break時才跳出循環,否則使用標志來記住是否已經遇到了真實條件,然后執行每個后續代碼塊,直到遇到break或到達switch的末端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM