1

以前の投稿をご覧になった方のために、私はまだ同じ Haskell ベースの文法に取り組んでいます。ほとんどのエラーはなくなりましたが、別の問題があります。

私の文法は次のとおりです。これは非常に大きくて読むのが面倒なことはわかっていますが、最終的にこれが必要なので、申し訳ありませんが、助けていただければ幸いです: (多くのロジックが欠落していますが、これらはすべてルールが必要です)

grammar T;



options {
language=Java;
backtrack=true;
}

tokens{
NUM = 'num';
LIST = 'list'; 
EVEN = 'even';
ODD = 'odd'; 
TWICE = 'twice';
HEAD = 'head';
TAIL = 'tail';
LENGTH = 'length'; 
MAX = 'max'; 
REV = 'reverse';
INC = 'incAll'; 
SORT = 'sort'; 
KEEP = 'keep';
DROP = 'drop';
POLY = 'poly'; 
}


@header {
import java.util.Hashtable;
import java.util.ArrayList;
}

@members
{
Hashtable <String, Integer> intMemory= new Hashtable<String, Integer>();
Hashtable <String, ArrayList> listMemory= new Hashtable <String, ArrayList>();
}


prog:   stat+ 
;

stat:   numDecl ';' //declares a variable containing an int
|listDecl ';' //declares a variable containing a list 
|numAdd ';' //adds two integers directly or through getting from the int hashtable  
|numEven ';' //determines whether or not int or id value is even
|numOdd ';' //determines whether or not int or id value is odd
|numTwice ';' {System.out.println($numTwice.value);} //double values and prints
|listHead ';'  {System.out.println($listHead.value);} //returns list head
|listTail ';' //returns list tail 
|listLength ';' //{System.out.println($listLength.value);} // returns list length
|listConc ';' //{System.out.println($listConc.value);} //concatenates 2 lists
|listMax ';' //{System.out.println($listMax.value);} //returns max of a list
|listReverse  ';' //{System.out.println($listReverse.value);}//reverses a list
|listInc  ';'  //{System.out.println($listInc.value);} //increments each list value by 1
|listSort  ';' //{System.out.println($listSort.value);}//sorts a list 
|listConst  ';'  //{System.out.println($listConst.value);}//constructs a list from another one 
|bothKeep  ';'  //{System.out.println($bothKeep.value);}// keeps a specified number of elements from a list
|bothDrop  ';'  //{System.out.println($bothDrop.value);}// drops a specified number of elements from the list
|bothPoly ';' //{System.out.println($bothPoly.value);}//evaluates a polynomial at a certain value

;

numDecl:
NUM  ID '=' atom {intMemory.put($ID.text, new Integer($atom.value));}
;

listDecl
@init {
int count = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
}:
LIST ID '=' '[' a1=atom {list.add($a1.value);} (',' a2=atom {list.add($a2.value);} )* ']' {listMemory.put($ID.text, list);}
;

numAdd returns [int value]: 
e=numMult {$value=$e.value;} ('+' e1=numMult {$value+=$e1.value;} | '-' e1=numMult {$value-=$e1.value;})* {System.out.println($numAdd.value);}
; 

numMult returns [int value]: 
e=atom {$value=$e.value;} ('*' e1=atom {$value*=$e1.value;} | '/' e1=atom {if($e1.value !=0) $value/=$e1.value;
                                     else System.out.println ("Division by 0 is impossible");})*
;

numEven:
EVEN (WS)+ atom {if ($atom.value\%2==0) System.out.println("Is Even.");}
;

numOdd:
ODD (WS)+ atom {if ($atom.value\%2==1) System.out.println("Is Odd.");}
;

numTwice returns [int value]:
TWICE (WS)+ atom {$value= 2*($atom.value); System.out.println($value);}
;

listHead returns [int value]:
HEAD headTail
;

headTail returns [int value]: 
ID {$value= (Integer) listMemory.get($ID.text).get(0);}
|'[' x=atom (',' atom )*']' {$value=$x.value;} 
;

listTail: 
TAIL tailTail
;

tailTail 
@init {
int count = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
}:
ID {System.out.println("[ "); for (int i=1; i<listMemory.size();i++) System.out.println(listMemory.get($ID.text).get(i)+","); System.out.println(" ]");}

|'[' a1=atom {list.add($a1.value);} (',' a2=atom{list.add($a2.value);} )* ']' {System.out.println("[ "); for (int i=1; i<list.size();i++) System.out.println(list.get (i)+","); System.out.println(" ]");}
;

listLength:
LENGTH lengthTail
; 

lengthTail returns [int value]
@init {
int count = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
}:

ID {$value=listMemory.get($ID.text).size();}

| '[' a1=atom {list.add($a1.value);} (',' a2=atom{list.add($a2.value);} )* ']' {$value=list.size();}
;

listConc: 
ID '+' '+' concTail
|'[' atom(',' atom)*']' '+' '+' concTail
;

concTail returns [ArrayList list]: 
ID {$list=listMemory.get($ID.text);}
| '[' atom(',' atom)*']'
; 


listMax:
MAX maxTail
;

maxTail: ID
| '[' atom (',' atom )*']'
;

listReverse: 
REV revTail
;
revTail: 
 ID
| '[' atom (',' atom )*']'
;

listInc: 
INC incTail
;

incTail: 
ID
| '[' atom (',' atom )*']'
;

listSort:
SORT sortTail
;

sortTail:
ID
|'[' atom (',' atom )*']'
;

listConst:
'[' atom constTail '|' ID '<-' ID ']'
;
constTail: 
'+' atom
|'-' atom
|'*' atom
|'/' atom
;

bothKeep: 
KEEP atom keepTail
;

keepTail
@init {
int count = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
}:
'[' a1=atom {list.add($a1.value);} (',' a2=atom{list.add($a2.value);} )* ']' 
|ID
;

bothDrop: 
DROP atom dropTail
;

dropTail returns [ArrayList value] 
@init {
int count = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
}:
'[' a1=atom {list.add($a1.value);} (',' a2=atom{list.add($a2.value);} )* ']' 
|ID
;

bothPoly: 
POLY atom polyTail
;

polyTail returns [ArrayList value] 
@init {
int count = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
}:
'['  a1=atom {list.add($a1.value);} (',' a2=atom{list.add($a2.value);} )* ']' {$value=list;}
|ID
;

atom returns [int value]:
 INT {$value = Integer.parseInt ($INT.text);}
| ID 
    {
        Integer v= (Integer)intMemory.get($ID.text);
        if (v!=null) {$value=v.intValue();}
        else { 
            System.err.println("Undefined variable "+$ID.text);
            }
    }
| '(' numAdd ')' {$value=$numAdd.value;}
;



Letter: 'a'..'z';
Digit: '0'..'9';

ID  :  'a'..'z'('0'..'9')*;
INT : '0'..'9'+ ;
WS :   (' '|'\t'|'\n'|'\r')+ {skip();} ;

メソッドをまだ実装していないため、リストに次の入力をまだ与えていません。

num x=4;
num y=9;
x+2;
2+3;
2-3;
x-2;
2*3;
x*2;
2/4;  
x/3;
x/0;
even x;
odd 5;
odd y;
twice x; 
twice y; 
twice 2; 

コマンドプロンプトから実行すると、次のようになります。

C:\Users\Kamal\Desktop\Antlr>java -cp .;antlr-3.2.jar org.antlr.Tool T.g

C:\Users\Kamal\Desktop\Antlr>javac -cp .;antlr-3.2.jar *.java

C:\Users\Kamal\Desktop\Antlr>java -cp .;antlr-3.2.jar TestT
line 1:4 mismatched input 'x' expecting ID
line 2:4 mismatched input 'y' expecting ID

何か助けていただければ幸いです。誰も本当に答えられなくても。どうもありがとう!

4

1 に答える 1

1

問題はおそらくこの場合と同じです。

あなたのIDルールは指定された入力と一致しますが、あなたの'x'and'y'値と一致する別のルールが存在する可能性があります。残念ながら、テスト用にここで antlr をセットアップしていませんが、あなたのLetterルールが問題を引き起こす可能性があります。DigitandLetterルールを次のように宣言してみてください。fragment

于 2013-07-23T07:42:08.237 に答える