0

C# の公式文法をantlr v4に翻訳することにしました。ただし、テスト中に次の問題が発生しました。指定された文法は、 のような単純な単語と一致しません\n\ntrue\n\n<EOF>。それは言い続けますmismatched input '\n\ntrue\n\n' expecting Literal 。の定義を残した後でもLiteralLiteral: BooleanLiteral;入力\n\ntrue\n\n<EOF>はまだ一致しません。私は文法が\ns comsume the trueandをスキップすることを期待していました<EOF>が、明らかにこれは起こっていません。デバッグを試みましたが、まだ問題を見つけることができませんでした。何か案は?

grammar Test;

start: Literal EOF;

/**********
 *
 * Literals
 *
 **********/

Literal
    :   BooleanLiteral 
    |   IntegerLiteral 
    |   RealLiteral 
    |   CharacterLiteral 
    |   StringLiteral 
    |   NullLiteral 
    ;

BooleanLiteral
    :   'true' 
    |   'false' 
    ;

IntegerLiteral
    :   DecimalIntegerLiteral 
    |   HexadecimalIntegerLiteral 
    ;

DecimalIntegerLiteral
    :   DecimalDigits IntegerTypeSuffix? 
    ;

DecimalDigits
    :   DecimalDigit+
    ;

DecimalDigit
    :   [0-9]
    ;

IntegerTypeSuffix
    :   'U' 
    |   'u' 
    |   'L' 
    |   'l' 
    |   'UL' 
    |   'Ul' 
    |   'uL' 
    |   'ul' 
    |   'LU' 
    |   'Lu' 
    |   'lU' 
    |   'lu' 
    ;

HexadecimalIntegerLiteral
    :   ('0x' | '0X') HexDigits IntegerTypeSuffix?
    ;

HexDigits
    :   HexDigit+
    ;

HexDigit    
    :   [0-9A-Fa-f]
    ;

RealLiteral
    :   DecimalDigits '.' DecimalDigits ExponentPart? RealTypeSuffix? 
    |   '.' DecimalDigits ExponentPart? RealTypeSuffix? 
    |   DecimalDigits ExponentPart RealTypeSuffix? 
    |   DecimalDigits RealTypeSuffix 
    ;

ExponentPart
    :   ('e' | 'E') Sign? DecimalDigits
    ;

Sign    
    :   '+'
    |   '-' 
    ;

RealTypeSuffix  
    :   'F'
    |   'f' 
    |   'D' 
    |   'd' 
    |   'M' 
    |   'm' 
    ;

CharacterLiteral
    :   '\'' Character '\'' 
    ;

Character
    :   SingleCharacter 
    |   SimpleEscapeSequence 
    |   HexadecimalEscapeSequence 
    |   UnicodeEscapeSequence 
    ;

UnicodeEscapeSequence
    :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit 
    |   '\\' 'U' HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit 
    ;

SingleCharacter
    :   ~[\\\\\\\u000D\u000A\u0085\u2028\u2029]
    ;

SimpleEscapeSequence    
    : '\\\''
    | '\\"'
    | '\\\\'
    | '\\0'
    | '\\a'
    | '\\b'
    | '\\f'
    | '\\n'
    | '\\r'
    | '\\t'
    | '\\v'
    ;

HexadecimalEscapeSequence
    :   '\\x' HexDigit HexDigit? HexDigit? HexDigit? 
    ;

StringLiteral
    :   RegularStringLiteral 
    |   VerbatimStringLiteral 
    ;

RegularStringLiteral
    :   '"' RegularStringLiteralCharacters? '"' 
    ;

RegularStringLiteralCharacters
    :   RegularStringLiteralCharacter+
    ;

RegularStringLiteralCharacter
    :   SingleRegularStringLiteralCharacter 
    |   SimpleEscapeSequence 
    |   HexadecimalEscapeSequence 
    |   UnicodeEscapeSequence 
    ;

SingleRegularStringLiteralCharacter
    :   ~["\\\u000D\u000A\u0085\u2028\u2029]
    ;

VerbatimStringLiteral
    :   '@"' VerbatimStringLiteralCharacters? '"' 
    ;

VerbatimStringLiteralCharacters
    :   VerbatimStringLiteralCharacter+
    ;

VerbatimStringLiteralCharacter
    :   SingleVerbatimStringLiteralCharacter 
    |   QuoteEscapeSequence 
    ;

SingleVerbatimStringLiteralCharacter
    :   ~["]
    ;

QuoteEscapeSequence
    :   '""' 
    ;

NullLiteral
    :   'null'
    ;


/**********
 *
 * Whitespaces and comments
 *
 **********/    

WS  : [ \t\r\n]+ -> skip
    ;

COMMENT
    :   '/*' .*? '*/' -> skip
    ;

LINE_COMMENT
    :   '//' ~[\r\n]* -> skip
    ;

編集:わかりました、問題をこのコードに切り分けることができました:

grammar Test;

start : VerbatimStringLiteral EOF ;

VerbatimStringLiteral
    :   '@"' VerbatimStringLiteralCharacter* '"' 
    ;

VerbatimStringLiteralCharacter
    :   SingleVerbatimStringLiteralCharacter 
    |   QuoteEscapeSequence 
    ;

SingleVerbatimStringLiteralCharacter
    :   ~["]
    ;

QuoteEscapeSequence
    :   '""' 
    ;

WS  :  [ \t\r\n]+ -> skip
    ;
4

1 に答える 1

1

トークン自体を生成しないレクサー ルールは、fragment修飾子でマークする必要があります。たとえばQuoteEscapeSequence、スタンドアロンのトークンではありません。これはVerbatimStringLiteralトークンの一部にすぎないため、 でマークする必要がありますfragment。ルールである必要があるその他のルールを次に示しfragmentます。

  • VerbatimStringLiteralCharacter
  • SingleVerbatimStringLiteralCharacter
  • SingleRegularStringLiteralCharacter
  • RegularStringLiteralCharacter
  • RegularStringLiteralCharacters←これは、この特定の入力に対するエラーの原因でした
  • SimpleEscapeSequence

他にもあるかもしれませんが、これで問題の内容と解決方法がわかります。

于 2013-07-26T11:31:13.253 に答える