2017-08-31 10 views
0

antlr4の完全な初心者として、私は同様のquestionへの答えを何も利用することができませんでした。これは、断片は端末のみ規則によって私の文法で呼ばれているように私には見えますが、文字列「myIdentifier」を提出したときはまだパーサは、次のエラーがスローされます。antlr4、簡単な文法、トークン認識エラー

line 1:0 token recognition error at: 'm' 
line 1:1 token recognition error at: 'y' 
line 1:2 token recognition error at: 'I' 
line 1:3 token recognition error at: 'd' 
line 1:4 token recognition error at: 'e' 
line 1:5 token recognition error at: 'n' 
line 1:6 token recognition error at: 't' 
line 1:7 token recognition error at: 'i' 
line 1:8 token recognition error at: 'f' 
line 1:9 token recognition error at: 'i' 
line 1:10 token recognition error at: 'e' 
line 1:11 token recognition error at: 'r' 

私の文法はこれです:

grammar Sable; 

options { 

} 

@header { 
    package org.sable.parser.gen; 
} 

IDENTIFIER: 
    (IdentifierHead IdentifierCharacter*) 
    | ('`'(IdentifierHead IdentifierCharacter*)'`') 
    ; 

WS : [ \u0020\u000C\u000A\u000D\u0009u000B\u000C]+ -> skip 
    ; 

COMMENT 
    : '/*' .*? '*/' -> channel(HIDDEN) 
    ; 

LINE_COMMENT 
    : '//' ~[\u000A\u000D]* -> channel(HIDDEN) 
    ; 




// NOTE: a file with zero statements is allowed because 
// it can contain just comments. 
sourceFile: 
    statement* EOF; 

statement: 
    expression ';'?; 

// Req. not existing any valid expression starting from 
// an equals sign or any other assignment operator. 
expression: 
    valuedExpression (assignmentOperator valuedExpression)?; 

valuedExpression: 
    IDENTIFIER 
    ; 

assignmentOperator: 
    '=' 
    | '*=' 
    | '/=' 
    | '%=' 
    | '+=' 
    | '-=' 
    | '<<=' 
    | '>>=' 
    | '&=' 
    | '^=' 
    | '|=' 
    ; 

fragment DecimalDigit: 
    '0'..'9' 
    ; 

fragment IdentifierHead: 
    'a'..'z' 
    | 'A'..'Z' 
    | '_' 
    | '\u00A8' 
    | '\u00AA' 
    | '\u00AD' 
    | '\u00AF' | 
    '\u00B2'..'\u00B5' | 
    '\u00B7'..'\u00BA' | 
    '\u00BC'..'\u00BE' | 
    '\u00C0'..'\u00D6' | 
    '\u00D8'..'\u00F6' | 
    '\u00F8'..'\u00FF' | 
    '\u0100'..'\u02FF' | 
    '\u0370'..'\u167F' | 
    '\u1681'..'\u180D' | 
    '\u180F'..'\u1DBF' | 
    '\u1E00'..'\u1FFF' | 
    '\u200B'..'\u200D' | 
    '\u202A'..'\u202E' | 
    '\u203F'..'\u2040' | 
    '\u2054' | 
    '\u2060'..'\u206F' | 
    '\u2070'..'\u20CF' | 
    '\u2100'..'\u218F' | 
    '\u2460'..'\u24FF' | 
    '\u2776'..'\u2793' | 
    '\u2C00'..'\u2DFF' | 
    '\u2E80'..'\u2FFF' | 
    '\u3004'..'\u3007' | 
    '\u3021'..'\u302F' | 
    '\u3031'..'\u303F' | 
    '\u3040'..'\uD7FF' | 
    '\uF900'..'\uFD3D' | 
    '\uFD40'..'\uFDCF' | 
    '\uFDF0'..'\uFE1F' | 
    '\uFE30'..'\uFE44' | 
    '\uFE47'..'\uFFFD' 
    ; 
fragment IdentifierCharacter: 
    DecimalDigit 
    | '\u0300'..'\u036F' 
    | '\u1DC0'..'\u1DFF' 
    | '\u20D0'..'\u20FF' 
    | '\uFE20'..'\uFE2F' 
    | IdentifierHead 
    ; 

私は間違って何をしていますか?私の仮定は以下のとおりです。

  • IDENTIFIERは、端末
  • IdentifierHeadIdentifierCharacterでいる 断片
  • すべてのルールを解析している残りの部分。バートKiers'はコメントに基づいて
+0

私はオンラインで見つかったテスト済みの文法の一部のルールを完全に変更していませんし、同様のテスト文字列でも同じエラーが発生しています。 誤ったケースに共通する部分はオプションと@headerディレクティブだけなので、エラーが原因である可能性があります。 – AmazingWouldBeGreatBut

+0

文法をテストするとき、 '' myIdentifier ''は' IDENTIFIER'としてトークン化されます。おそらく、あなたはレクサー/パーサーを再生成する必要がありますか?空の 'options {}'ブロックの有無にかかわらず、うまくいきます。 –

+0

こんにちはバート。入力いただきありがとうございます。まあ、それは、私の文法ではなく、間違っていることが少なくとも私の環境である限り、ある程度意味をなさない。 私はCertivのEclipse組み込みジェネレータを使用しています。私はantlr4のスタンドアローンインストールでそれをやろうとし、それがどうなるかを見てみましょう。 – AmazingWouldBeGreatBut

答えて

1

私はあなたの文法をテスト

は、 "myIdentifier" 識別子としてトークン化されます。 おそらく、あなたのレクサー/パーサーを再生成する必要がありますか? 空のオプション{}ブロックの有無にかかわらず、正常に動作します。

私の文法ではなく、私の環境に問題があることが判明しました。私はCertivのantlr4サポートプラグインを使ってEclipseに文法を生成していました。コマンドラインからantlr4を使って文法を生成したら、エラーは消えました。

関連する問題