以下の文法を定義しました。結果は成功したが、私ははAntlrで文法を定義します
A=(1,1)
B=(1,2)
G=(A,E)
を書くならば、それはEではないというエラーを与え、私は例を持っている
A=(1,1)
B=(1,2)
G=(A,B)
ように、この文法をチェックインする方法
grammar Sample_1;
@header {
package a;
}
@lexer::header {
package a;
}
program
:
define*
implement*
;
define
: IDENT '=(' INTEGER',' INTEGER ')'
;
implement
:IDENT '=(' (IDENT ','?)* ')'
;
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+ ;
IDENT : LETTER (LETTER | DIGIT)*;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
COMMENT : '//' .* ('\n'|'\r') {$channel = HIDDEN;};
定義 ありがとう
結果: 私は私を得たトン作業のおかげでたくさん:
grammar Sample_1;
@members{
int level=0;
}
@header {
package a;
}
@lexer::header {
package a;
}
program
:
block
;
block
scope {
List symbols;
}
@init {
$block::symbols=new ArrayList();
level++;
}
@after {
System.err.println("Hello");
level--;
}
: (define* implement+)
;
define
: IDENT {$block::symbols.add($IDENT.text);} '=(' INTEGER',' INTEGER ')'
;
implement
:IDENT '=(' (a=IDENT
{if (!$block::symbols.contains($a.text)){
System.err.println("undefined");
}}','?)* ')'
;
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+ ;
IDENT : LETTER (LETTER | DIGIT)*;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
COMMENT : '//' .* ('\n'|'\r') {$channel = HIDDEN;};
つまり、文法の評価はコンテキストに依存しますか? – Anon
はい、実装がどれくらい難しいのかわかりません – Eldeus
'H =(A、3)'と書くことも許されていますか? –