0
我試圖通過直接閱讀treeWalker並實現編譯器所需的命令來實現解析器。所以,如果我有一個像這樣的命令:ANTLR Tree Grammar for loops
statement
:
^('WRITE' expression)
{
//Here is the command that is created by my Tree Parser
ch.emitRO("OUT",0,0,0,"write out the value of ac");
//and then I handle it in my other classes
}
;
我希望它寫OUT 0,0,0;到一個文件。這是我的語法。
我有一個問題,但在我的語法環部分,它是:
'WHILE'^ expression 'DO' stat_seq 'ENDDO'
,並在樹解析器:
doWhileStatement
:
^('WHILE' expression 'DO' stat_seq 'ENDDO')
;
我想要做的是直接解析從代碼while循環進入我需要的命令。我想出了這個解決方案,但它不工作:
doWhileStatement
:
^('WHILE' e=expression head='DO'
{
int loopHead =((CommonTree) head).getTokenStartIndex();
}
stat_seq
{
if ($e.result==1) {
input.seek(loopHead);
doWhileStatement();
}
}
'ENDDO')
;
備案這裏有一些我寫的其他命令:(忽略寫在括號中的代碼 ,這是對的產生。在文本文件中的命令)
stat_seq
:
(statement)+
;
statement
:
^(':=' ID e=expression) { variables.put($ID.text,e); }
| ^('WRITE' expression)
{
ch.emitRM("LDC",ac,$expression.result,0,"pass the expression value to the ac reg");
ch.emitRO("OUT",ac,0,0,"write out the value of ac");
}
| ^('READ' ID)
{
ch.emitRO("IN",ac,0,0,"read value");
}
| ^('IF' expression 'THEN'
{
ch.emitRM("LDC",ac1,$expression.result,0,"pass the expression result to the ac reg");
int savedLoc1 = ch.emitSkip(1);
}
sseq1=stat_seq
'ELSE'
{
int savedLoc2 = ch.emitSkip(1);
ch.emitBackup(savedLoc1);
ch.emitRM("JEQ",ac1,savedLoc2+1,0,"skip as many places as needed depending on the expression");
ch.emitRestore();
}
sseq2=stat_seq
{
int savedLoc3 = ch.emitSkip(0);
ch.emitBackup(savedLoc2);
ch.emitRM("LDC",PC_REG,savedLoc3,0,"skip for the else command");
ch.emitRestore();
}
'ENDIF')
| doWhileStatement
;
任何幫助,將不勝感激,謝謝
沒有任何反饋,因爲它(IMO)來解決這個問題一個混亂的方式。你將語法中的所有代碼混合在一起,使語法非常難以維護。 –
當然,這是一個完全混亂的方式,我同意你的看法。但是我坐了5個小時,並且找不到關於這個主題的任何好文檔,不得不自己測試它,或者嘗試從互聯網上隨機發送代碼,這通常是在很久以前提交的。我只是堅持第一個工作。 我只是爲大學制作一個項目,而且我已經在解析上花了很多時間。 –