我顯然是在下面的語言定義了一個錯誤:ANTLR語言 - 樹沒有創建(EOF - 語法錯誤)
grammar Hello;
object :
ALL* NAME ALL* '{'
(ALL* | (ALL* NAME ALL* NAME)* | (ALL* object)*)*
'}' ALL*;
ALL :
(~('{' | '}' | '"'))+ -> skip; // All but braces and double quotes
NAME :
'"' ALL* '"';
當我試圖讀取文件或直接添加內容(與run.bat Hello object -gui
),解析器給我一個語法錯誤:mismatched input '<EOF>' expecting NAME
。 而我只有一棵有單個節點的樹:'object'。
這裏是Java源代碼:
public static void main(String[] args) throws Exception {
HelloLexer lexer = new HelloLexer(new ANTLRFileStream("gamemodes.txt"));
TokenStream tokenStream = new CommonTokenStream(lexer);
HelloParser parser = new HelloParser(tokenStream);
System.out.println(lexer.getAllTokens().size());
parser.setBuildParseTree(true);
// Tree Creation
RuleContext tree = parser.object();
tree.inspect(parser);
}
最後,文件結構(有一些空格/任何字符(不含括號和雙引號)):
...
"objName"
{
...
"innerObjName1"
{
"firstProperty" "firstResult"
...
"secondProp" ""
}
"innerObjName2"
{
"firstProperty" "firstResult"
"secondProp" ""
}
}
...
備註:我在Windows上。
謝謝!
我認爲你正試圖用正則表達式創建的語法規則(以小寫字母開頭的規則,如'object'規則)。我不認爲antlr可以處理這個問題。解析器規則擁有更簡單的機制。 –
我在正式網站(http://www.antlr.org/wiki/display/ANTLR4/Parser+Rules#ParserRules-Subrules)中看到了一些類似於語法(*,+,?)的正則表達式的例子。 。順便說一句,如果你有一個想法來解決我的問題,我在聽你:) – Val
哇,這好像叫做EBNF,我甚至不知道它存在。很高興知道這一點。可悲的是,雖然我無法幫助你解決你的問題。 –