簡體   English   中英

Java CUP和JFlex交互

[英]Java CUP and JFlex Interaction

我正在考慮為項目使用CUP解析器生成器。 為了正確地解析我將要編譯的語言的某些結構,我將需要詞法分析器(由JFlex生成)來使用符號表(而不是解析表)中的信息-我的意思是將要存儲在其中的表解析器的信息(有關標識符的信息),以在調用其next_token()方法時生成正確的令牌類型。 由於符號表中的信息靜態依賴於程序文本,因此只有在使用解析器“在鎖步中”調用next_token()方法時,這才起作用。 換句話說,如果解析器每當需要另一個令牌時就調用詞法分析器,則這將起作用,但是(例如)如果有一個並行線程正在調用詞法分析器並在隊列中緩沖令牌,則不會。

因此,問題是:CUP如何調用詞法分析器? 每當需要下一個令牌時會調用它嗎? 我當然可以只編寫一個CUP語法規范並檢查生成的解析器的源文件以查看發生了什么,但這可能比必要的工作多。 我在相關網站上找不到任何信息。

非常感謝您提供的任何幫助!

我不久前完成了解析器和掃描器的實現。 這是我發現的:

實際上,CUP確實會在需要時調用掃描程序。 它總是在到目前為止已識別的令牌(超前令牌)之前再緩沖一個令牌。 提前沒有令牌的花式緩沖。

話雖這么說,在解析過程中設置詞法分析器狀態可能很棘手,因為這會引起許多語法沖突。 我想這與CUP表示產品中嵌入的語義動作的方式有關。 盡管如此,這迫使我放棄了最初的設計,但這並不是出於我害怕的原因。

希望這對某人有幫助!

也許此回復對您來說為時已晚,但對其他用戶可能有用。 首先要知道的是,沒有掃描儀,解析器將無法執行任何操作。 實際上,解析器的構造函數的第一個參數是掃描器。 編譯完.cup文件后,您將獲得一個與.cup名稱相同的.java文件作為輸出。 讓我們假設它的名字是Parser。 因此,在項目的主類中,您必須添加以下行:

TmpParser p = new TmpParser (new Scanner (new Reader (s)));   
        p.parse();

您應該將此代碼發布到try-catch塊中。 通過解析方法,解析器將開始其操作,並調用掃描程序的next_token方法,以便識別令牌並驗證您編寫的語法規則是否正確。

我不知道我要回答這個問題有多晚,但是我正在構建1個解析器作為我的課程工作的一部分。我分別將Lex和CUP用於lexer和Parser。 我還包括我的主類,該主類調用解析器,該解析器將按要求在獲取令牌調用時進行掃描,因此我的驅動程序類將是:

// construct the lexer, 
Yylex lexer = new Yylex(new FileReader(filename));
// create the parser
Parser parser = new Parser(lexer);
// and parse

解析器實習生調用:

Parser.parse() {
    ...
    this.cur_token = this.scan();
    ...
}

public Symbol scan() throws Exception {
    Symbol sym = this.getScanner().next_token();
    return sym != null ? sym : this.getSymbolFactory().newSymbol("END_OF_FILE", this.EOF_sym());
}

parser.parse();

暫無
暫無

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

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