2017-09-07 3 views
0

私の割り当てにパーサーのルールを書き込もうとしています。代入では、 "変数宣言"の部分をいくつかの型で行う必要があります。私はすべてのタイプでうまくいった。例:ANTLR4 - パーサーのテストケースが機能していません

int i;

または:

ブールBC。

しかし、Array型では機能しません。例:

int a [5];ここで

私が書いたコードです:

vardecl: pritype id (COMMA id)* SEMI ; 
pritype: INTTYPE | BOOLEANTYPE | FLOATTYPE | STRINGTYPE ; 
id: ID | ID LSB INTLIT RSB ; 

INTTYPE: 'int' ; 
BOOLEANTYPE: 'boolean' ; 
FLOATTYPE: 'float' ; 
STRINGTYPE: 'string' ; 
ID: [_a-zA-Z] [_a-zA-Z0-9]* ; 
INTLIT: [0-9]+ -> type(INTTYPE) ; 
LSB: '[' ; 
RSB: ']' ; 
COMMA: ',' ; 
SEMI: ';' ; 

あなたは私が配列型が動作するために間違っていたものを私に示すことができます。前もって感謝します!!

答えて

0

あなたのソリューションは非常に近いですが、別のチャネルにINTLITをチャネリングすると問題が発生していました。私はそれを少し簡略化し、空白の処理を追加しました。この入力で

grammar Vardecl; 
vardecl: pritype id (COMMA id)* SEMI ; 
pritype: INTTYPE | BOOLEANTYPE | FLOATTYPE | STRINGTYPE ; 
id: ID | ID array ; 
array : LSB INTLIT RSB; 
INTTYPE: 'int' ; 
BOOLEANTYPE: 'boolean' ; 
FLOATTYPE: 'float' ; 
STRINGTYPE: 'string' ; 
ID: [_a-zA-Z] [_a-zA-Z0-9]* ; 
INTLIT: [0-9]+ ; 
LSB: '[' ; 
RSB: ']' ; 
COMMA: ',' ; 
SEMI: ';' ; 
WS: [ \t\r\n] -> skip; 

:しかし、私はあなたがより簡単にあなたの訪問者やリスナーでこの構文を処理できるようになりますarrayルールを追加

[@0,0:2='int',<'int'>,1:0] 
[@1,4:4='i',<ID>,1:4] 
[@2,5:5='[',<'['>,1:5] 
[@3,6:6='5',<INTLIT>,1:6] 
[@4,7:7=']',<']'>,1:7] 
[@5,8:8=',',<','>,1:8] 
[@6,10:10='a',<ID>,1:10] 
[@7,11:11='[',<'['>,1:11] 
[@8,12:13='10',<INTLIT>,1:12] 
[@9,14:14=']',<']'>,1:14] 
[@10,15:15=';',<';'>,1:15] 
[@11,16:15='<EOF>',<EOF>,1:16] 

int i[5], a[10]; 

あなたは、このレクサーのトークン化を取得

この解析ツリー:

enter image description here

だから、あなたは今すぐ行くのが良いと思います。

+0

ありがとうございます@トム、あなたは正しいです。あなたのソリューションは非常に明確です。早く実現できることを願っています。 –

+0

@DeenThatcher私のソリューションが役立つことを嬉しく思います!あなたはそれを報いる方法としてそれを受け入れ、他の人がそれを見つけるのを助けることができます。 [これを見てください](https://stackoverflow.com/help/someone-answers) – TomServo

関連する問題