簡體   English   中英

有沒有辦法強制 JavaCC 接受模棱兩可的非 LL(1) 語法?

[英]Is there a way to force JavaCC to accept ambiguous non-LL(1) grammar?

我正在嘗試在 JavaCC 中創建一個教學解析器來解釋我的家庭作業中前瞻的使用。 我正在考慮在 porpose 上創建一個模棱兩可的語法來顯示解析器在這種情況下的行為。 我的語法如下:

void s() : 
{}
{
    "a" ( bc() | bd() ) <EOF>   
}

void bc() :
{}
{
    "b" "c"
}

void bd() :
{}
{
    "b" "d"
}

閱讀關於前瞻的JavaCC 教程我明白,在解析器創建時,將顯示有關使用前瞻的警告(好的),如果忽略,解析器仍然可以工作,但始終選擇第一個選項。 我認為是最后一部分,因為教程說“生成的解析器仍將使用默認的前瞻算法工作,但它可能不會按照您的預期運行。”

但是,當我嘗試創建解析器時,會顯示此錯誤:

$ javac *.java
ExampleABCD.java:18: error: unreachable statement
        }{
         ^
1 error

原因是:

case 6:{
        bc();
        break;
        }{        //Here
        bd();
        break;
        }

我希望解析器工作但不正常。 不應該是這樣嗎? 如果預期會出現此錯誤,即使使用這種模棱兩可的語法,有沒有辦法使其工作?

注意:我還不想使用lookahead,我的目標是稍后在解釋它如何解決問題時使用它。

現在 JavaCC 對此沒有任何問題。 它會生成正確反映 .jj 文件的警告和 .java 代碼。 問題是您的 Java 編譯器不喜歡無法訪問的代碼。

請參閱有沒有辦法忽略“無法訪問的語句”錯誤?

你能做的是這個

void s() : 
{}
{
    "a" ( LOOKAHEAD({true})  // TODO fix the lookahead
          bc()
        | 
          bd() )
    <EOF>   
}

暫無
暫無

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

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