簡體   English   中英

Java CC問題-“(…)*”內的擴展名可以用空字符串匹配”

[英]Java CC issue - “Expansion within ”(…)*“ can be matched by empty string”

我們已經獲得了使用Java CC進行修補和解析的語法。 它的問題之一是“(...)*內的擴展可以通過空字符串匹配。我理解此錯誤是由於某些內容可以匹配零次或多次而其他可以匹配的內容中引起的零次或多次。

我不明白的是如何解決它。 (我們的講師並沒有說太多,“您必須謹慎使用。”

語法的問題區域及其相關的Java CC代碼如下所示。 任何想法或建議,將不勝感激。

program := ( decl )*
           ( function ) *
           main_prog

decl := ( var_decl | const_decl )*

var_decl := var ident_list : type ( , ident_list : type)* ;

const_decl := const identifier : type = expression ( , identifier : type = expression)* ;

function :=
            type identifier ( param_list)
            ( decl )*
            ( statement ; )*
            return ( expression | e ); //e is greek epsilon character

main_prog := 
            main
            ( decl ) *
            (statement ; )*

問題在於我認為decl的聲明方式。 它是在實際的Java CC代碼中聲明的:

void decl():{}
{
( var_decl() | const_decl())*
}

如果我將上述Kleene閉包更改為+,則其他所有由此引起的錯誤都會消失。 但是,講師說應該保留星星,並且我們應該謹慎對待它。 我在左因子分解,左遞歸刪除等方面發現了很多資源,但是在這個特定問題上很少。 上面的代碼實際上在Java CC中沒有錯誤,但是是導致進一步錯誤的原因,如下所示:

void program():{}
{
( decl() )* //error here - Expansion within "(...)*" can be matched by empty string
( function() )*
main_prog()
}

void main_prog(): {}
{
< MAIN >
( decl() )* //same error on this line
(statement() < SCOLON >)*
}

void function(): {}
{
type() < ID > <LPARENT > param_list() < RPARENT >
( decl() )* //same error on this line
( statement() < SCOLON > )*
< RET> ( expression() | {} ) <SCOLON > // {} is epsilon
}

任何有關如何解決此問題的想法將不勝感激。

就目前而言,您的語法是模棱兩可的-它表示decl表示零個或多個聲明,並且在許多地方您允許零個或多個decl 您在這兩個地方都不需要* ,只需選擇一個或另一個,這兩種方法都可以解析相同的程序,但是它們在概念上略有不同。

您可以在decl取出*

decl := ( var_decl | const_decl )

program := ( decl )*
           ( function ) *
           main_prog

因此decl表示單個聲明, program 可以decl s序列開頭,但不一定要這樣。 或者,您可以將*保留為decl但從引用它的地方將其取出:

decl := ( var_decl | const_decl )*

program := decl
           ( function ) *
           main_prog

因此,現在decl代表的是“聲明塊”之類的東西,而不是單個聲明-每個program 必須以聲明塊開頭,但該塊本身允許為空。

暫無
暫無

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

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