2010-03-09 87 views
1

我試圖測試「whenDescriptor」規則在以下語法在AntLRWorks中。只要我開始調試,我就會不斷收到異常。測試輸入的文本是 「當順序:OrderBll然後」ANTLR規則調試錯誤

[16:45:07] C:\Documents and Settings\RM\My Documents\My Tools\AntLRWorks\output\__Test__.java:14: cannot find symbol 
[16:45:07] symbol : method whenDescriptor() 
[16:45:07] location: class RulesTranslatorParser 
[16:45:07]    g.whenDescriptor(); 
[16:45:07]   ^
[16:45:07] 1 error 

我能夠測試「packageDescriptor」「declareDescriptor」成功。有沒有人知道解決錯誤信息?我嘗試過輸入字符串的各種組合,但規則調試失敗。

這是我的語法。

grammar RulesTranslator; 

options 
{ 
    backtrack=true; 
    memoize=true; 
    language=CSharp2; 
} 

tokens { 
    AND='and'; 
    OR='or'; 
    NOT='not'; 
    EXISTS='exists'; 
    EVAL='eval'; 
    FORALL='forall'; 
    CONTAINS='contains'; 
    IS='is'; 
    INSTANCEOF='instanceof'; 
    STRSIM='strsim'; 
    SOUNDSLIKE='soundslike'; 
    IN='in'; 
    NEW='new'; 
    WITH='with'; 
    ASSERT='assert'; 
    ISDEF='isdef'; 
} 

packageDescriptor 
    : 'package' qualifiedName 
    ; 

declareDescriptorList 
    : (declareDescriptor)* 
    ; 

declareDescriptor 
    : 'declare' qualifiedName (variableDef)+ 'end' 
    ; 

whenDescriptor 
    : 'when' typeRef 'then' 
    ; 

typeRef 
    : (Identifier | variableDef) 
    ; 

qualifiedNameList 
    : qualifiedName (',' qualifiedName)* 
    ; 

qualifiedName 
    : Identifier ('.' Identifier)* 
    ; 

variableDef 
    : (Identifier ':' Identifier | Identifier ':' qualifiedName) 
    ; 

// STATEMENTS/BLOCKS   
fieldseperator 
    : (',' | ';') 
    ; 

logicalOperator 
    : ('&&' | '||' | '~=') 
    ; 

// Lexar 
HexLiteral : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ; 

DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ; 

OctalLiteral : '0' ('0'..'7')+ IntegerTypeSuffix? ; 

fragment 
HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ; 

fragment 
IntegerTypeSuffix : ('l'|'L') ; 

FloatingPointLiteral 
    : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix? 
    | '.' ('0'..'9')+ Exponent? FloatTypeSuffix? 
    ; 

fragment 
Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; 

fragment 
FloatTypeSuffix : ('f'|'F'|'d'|'D') ; 

CharacterLiteral 
    : '\'' (EscapeSequence | ~('\''|'\\')) '\'' 
    ; 

StringLiteral 
    : '"' (EscapeSequence | ~('\\'|'"'))* '"' 
    ; 

fragment 
EscapeSequence 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | UnicodeEscape 
    | OctalEscape 
    ; 

fragment 
OctalEscape 
    : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') 
    ; 

fragment 
UnicodeEscape 
    : '\\' 'u' HexDigit HexDigit HexDigit HexDigit 
    ; 

Identifier 
     : IdentifierStart (IdentifierStart|IdentifierPart)* 
     ; 

fragment 
IdentifierStart 
    : '\u0024' | 
     '\u0041'..'\u005a' | 
     '\u005f' | 
     '\u0061'..'\u007a' | 
     '\u00c0'..'\u00d6' | 
     '\u00d8'..'\u00f6' | 
     '\u00f8'..'\u00ff' | 
     '\u0100'..'\u1fff' | 
     '\u3040'..'\u318f' | 
     '\u3300'..'\u337f' | 
     '\u3400'..'\u3d2d' | 
     '\u4e00'..'\u9fff' | 
     '\uf900'..'\ufaff' 
    ; 

fragment 
IdentifierPart 
    : '\u0030'..'\u0039' | 
     '\u0660'..'\u0669' | 
     '\u06f0'..'\u06f9' | 
     '\u0966'..'\u096f' | 
     '\u09e6'..'\u09ef' | 
     '\u0a66'..'\u0a6f' | 
     '\u0ae6'..'\u0aef' | 
     '\u0b66'..'\u0b6f' | 
     '\u0be7'..'\u0bef' | 
     '\u0c66'..'\u0c6f' | 
     '\u0ce6'..'\u0cef' | 
     '\u0d66'..'\u0d6f' | 
     '\u0e50'..'\u0e59' | 
     '\u0ed0'..'\u0ed9' | 
     '\u1040'..'\u1049' 
    | '\uff10'..'\uff19' 
    ; 

WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;} 
    ; 

COMMENT 
    : '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 
    ; 

LINE_COMMENT 
    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 
    ; 

NEWLINE : ('\r')? '\n' {skip();} 
    ; 

感謝,

+0

分歧討論:http://n2.nabble.com/AntLRWorks-Rule-Debugging-Error-td4705497.html#a4705497 – 2010-03-10 08:36:17

回答

0

這是一個奇怪的錯誤,但是當我調試,並指定一個特定的規則來啓動與調試,這條規則是產生「__Test__.java」文件的地方。然後,如果我更改調試程序的啓動規則並重新生成,則新的啓動規則位於該文件中。我猜你最後生成的調試有不同的起始規則,而其他規則仍在文件中。

如果沒有指定任何操作,您可以在選項中註釋掉語言,並快速在ANTLRWorks中進行調試,而無需通過所有的C#代碼編譯。

而一個更好的選擇是創建一個主要規則將被調用的時候,你正在測試應該在主要規則這些規則是這樣的:

prog : packageDescriptor | declareDescriptor | whenDescriptor; 

然後調用調試會話的主要規則並使用該主規則生成文件。隨着您添加更多要調試的規則,請添加到此主規則中。

所以我猜沒有主要規則的解決方案是1)在ANTLRWorks中單擊調試選項並選擇您正在測試的規則,此時可以停止調試。 2)在調試器停止的ANTLRWorks中,生成代碼(在這一點上,你應該能夠檢查java文件,並確保它包含正確的規則。3)像你一樣調試(編譯C#代碼,執行和在ANTLRWorks中進行調試)

哦,您可能想要了解規則whenDescriptor如何通過規則variableDef間接調用規則qualifiedName,variableDef中的兩個選項都可以匹配「標識符」:「標識符」。根據您測試的內容,qualifiedName規則對於規則packageDescriptor和declareDescriptor是正確的。當前的語法應該按規則使用規則variableDef,但是我建議刪除第一個選項,並且不要從ANTLR收到任何有關某個輸入禁用選項2的問題或投訴。

0

該語法起作用。建議不要在語法級別使用回溯和記憶。在規則級別需要時使用它。

grammar RulesTranslator; 

options 
{ 
    k = 5; 
    language=Java; 
} 

tokens { 
    AND='and'; 
    OR='or'; 
    NOT='not'; 
    EXISTS='exists'; 
    EVAL='eval'; 
    FORALL='forall'; 
    CONTAINS='contains'; 
    IS='is'; 
    INSTANCEOF='instanceof'; 
    STRSIM='strsim'; 
    SOUNDSLIKE='soundslike'; 
    IN='in'; 
    NEW='new'; 
    WITH='with'; 
    ASSERT='assert'; 
    ISDEF='isdef'; 
} 

packageDescriptor 
    : 'package' qualifiedName 
    ; 

declareDescriptorList 
    : (declareDescriptor)* 
    ; 

declareDescriptor 
    : 'declare' qualifiedName (variableDef)+ 'end' 
    ; 

whenDescriptor 
    : 'when' typeRef 'then' 
    ; 

typeRef 
    : (Identifier | variableDef) 
    ; 

qualifiedNameList 
    : qualifiedName (',' qualifiedName)* 
    ; 

qualifiedName 
    : Identifier ('.' Identifier)* 
    ; 

qualifiedName_no_Identifier 
    : 
      ('.' Identifier)+ 
    ; 

variableDef 
    : Identifier ':' Identifier 
     (
       /*Empty*/ 
       | qualifiedName_no_Identifier 
     ) 
    ; 

// STATEMENTS/BLOCKS   
fieldseperator 
    : (',' | ';') 
    ; 

logicalOperator 
    : ('&&' | '||' | '~=') 
    ; 

// Lexar 
HexLiteral : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ; 

DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ; 

OctalLiteral : '0' ('0'..'7')+ IntegerTypeSuffix? ; 

fragment 
HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ; 

fragment 
IntegerTypeSuffix : ('l'|'L') ; 

FloatingPointLiteral 
    : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix? 
    | '.' ('0'..'9')+ Exponent? FloatTypeSuffix? 
    ; 

fragment 
Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; 

fragment 
FloatTypeSuffix : ('f'|'F'|'d'|'D') ; 

CharacterLiteral 
    : '\'' (EscapeSequence | ~('\''|'\\')) '\'' 
    ; 

StringLiteral 
    : '"' (EscapeSequence | ~('\\'|'"'))* '"' 
    ; 

fragment 
EscapeSequence 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | UnicodeEscape 
    | OctalEscape 
    ; 

fragment 
OctalEscape 
    : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') 
    ; 

fragment 
UnicodeEscape 
    : '\\' 'u' HexDigit HexDigit HexDigit HexDigit 
    ; 

Identifier 
     : IdentifierStart (IdentifierStart|IdentifierPart)* 
     ; 

fragment 
IdentifierStart 
    : '\u0024' | 
     '\u0041'..'\u005a' | 
     '\u005f' | 
     '\u0061'..'\u007a' | 
     '\u00c0'..'\u00d6' | 
     '\u00d8'..'\u00f6' | 
     '\u00f8'..'\u00ff' | 
     '\u0100'..'\u1fff' | 
     '\u3040'..'\u318f' | 
     '\u3300'..'\u337f' | 
     '\u3400'..'\u3d2d' | 
     '\u4e00'..'\u9fff' | 
     '\uf900'..'\ufaff' 
    ; 

fragment 
IdentifierPart 
    : '\u0030'..'\u0039' | 
     '\u0660'..'\u0669' | 
     '\u06f0'..'\u06f9' | 
     '\u0966'..'\u096f' | 
     '\u09e6'..'\u09ef' | 
     '\u0a66'..'\u0a6f' | 
     '\u0ae6'..'\u0aef' | 
     '\u0b66'..'\u0b6f' | 
     '\u0be7'..'\u0bef' | 
     '\u0c66'..'\u0c6f' | 
     '\u0ce6'..'\u0cef' | 
     '\u0d66'..'\u0d6f' | 
     '\u0e50'..'\u0e59' | 
     '\u0ed0'..'\u0ed9' | 
     '\u1040'..'\u1049' 
    | '\uff10'..'\uff19' 
    ; 

WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;} 
    ; 

COMMENT 
    : '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 
    ; 

LINE_COMMENT 
    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 
    ; 

NEWLINE : ('\r')? '\n' {skip();} 
    ; 

謝謝, Gokul。