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は、端末
- IdentifierHeadとIdentifierCharacterでいる 断片
- すべてのルールを解析している残りの部分。バートKiers'はコメントに基づいて
私はオンラインで見つかったテスト済みの文法の一部のルールを完全に変更していませんし、同様のテスト文字列でも同じエラーが発生しています。 誤ったケースに共通する部分はオプションと@headerディレクティブだけなので、エラーが原因である可能性があります。 – AmazingWouldBeGreatBut
文法をテストするとき、 '' myIdentifier ''は' IDENTIFIER'としてトークン化されます。おそらく、あなたはレクサー/パーサーを再生成する必要がありますか?空の 'options {}'ブロックの有無にかかわらず、うまくいきます。 –
こんにちはバート。入力いただきありがとうございます。まあ、それは、私の文法ではなく、間違っていることが少なくとも私の環境である限り、ある程度意味をなさない。 私はCertivのEclipse組み込みジェネレータを使用しています。私はantlr4のスタンドアローンインストールでそれをやろうとし、それがどうなるかを見てみましょう。 – AmazingWouldBeGreatBut