Java Antlr4语法编译错误

Java Antlr4语法编译错误,java,antlr4,chess,Java,Antlr4,Chess,我为ANTLR4制作了自己的国际象棋PGN语法,但我得到了一个java stacktrace错误: Pgn.g4语法: grammar Pgn; file: game (NEWLINE+ game)*; game: (tag+ NEWLINE+)? notation; tag: '['TAG_TYPE "TAG_VALUE"']'; notation: move+ END_RESULT?; move: MOVE_NUMBER\. MOVE_DESC

我为ANTLR4制作了自己的国际象棋PGN语法,但我得到了一个java stacktrace错误:

Pgn.g4语法:

grammar Pgn;

file:       game (NEWLINE+ game)*;
game:       (tag+ NEWLINE+)? notation;

tag:        '['TAG_TYPE "TAG_VALUE"']';
notation: move+ END_RESULT?;
move:   MOVE_NUMBER\. MOVE_DESC MOVE_DESC       #CompleteMove
        |   MOVE_NUMBER\. MOVE_DESC             #OnlyWhiteMove
        |   MOVE_NUMBER\.\.\. MOVE_DESC         #OnlyBlackMove
        ;

END_RESULT: '1-0'
            | '0-1'
            | '1/2-1/2'
            ;

TAG_TYPE:   LETTER+;
TAG_VALUE:  .*;

MOVE_NUMBER: DIGIT+;
MOVE_DESC: .*;  

NEWLINE:    \r? \n;
SPACES:     [ \t]+ -> skip;

fragment LETTER: [a-zA-Z];
fragment DIGIT: [0-9];
这是错误输出:

$ antlr4 Pgn.g4 
org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 24:11 required (...)+ loop did not match anything at input 'r'
org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 24:15 mismatched tree node: n expecting <UP>
org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 24:11 required (...)+ loop did not match anything at input 'r'
org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 24:15 mismatched tree node: n expecting <UP>
org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 24:11 required (...)+ loop did not match anything at input 'r'
org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 24:15 mismatched tree node: n expecting <UP>
org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 24:11 required (...)+ loop did not match anything at input 'r'
org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 24:15 mismatched tree node: n expecting <UP>
error(20):  internal error: Rule LETTER undefined 
error(20):  internal error: element list has first|last == null 
Exception in thread "main" java.lang.NullPointerException
    at org.antlr.v4.automata.ParserATNFactory.elemList(ParserATNFactory.java:445)
    at org.antlr.v4.automata.ParserATNFactory.alt(ParserATNFactory.java:414)
    at org.antlr.v4.parse.ATNBuilder.alternative(ATNBuilder.java:567)
    at org.antlr.v4.parse.ATNBuilder.block(ATNBuilder.java:400)
    at org.antlr.v4.parse.ATNBuilder.subrule(ATNBuilder.java:1185)
    at org.antlr.v4.parse.ATNBuilder.element(ATNBuilder.java:887)
    at org.antlr.v4.parse.ATNBuilder.alternative(ATNBuilder.java:550)
    at org.antlr.v4.parse.ATNBuilder.ruleBlock(ATNBuilder.java:289)
    at org.antlr.v4.automata.ParserATNFactory._createATN(ParserATNFactory.java:148)
    at org.antlr.v4.automata.LexerATNFactory.createATN(LexerATNFactory.java:94)
    at org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:407)
    at org.antlr.v4.Tool.process(Tool.java:376)
    at org.antlr.v4.Tool.processGrammarsOnCommandLine(Tool.java:343)
    at org.antlr.v4.Tool.main(Tool.java:190)
$antlr4 Pgn.g4
org\antlr\v4\parse\GrammarTreeVisitor.g:第24:11行中的节点必需(…)+循环与输入“r”处的任何内容都不匹配
org\antlr\v4\parse\GrammarTreeVisitor.g:第24:15行中的节点不匹配树节点:n
org\antlr\v4\parse\GrammarTreeVisitor.g:第24:11行中的节点必需(…)+循环与输入“r”处的任何内容都不匹配
org\antlr\v4\parse\GrammarTreeVisitor.g:第24:15行中的节点不匹配树节点:n
org\antlr\v4\parse\GrammarTreeVisitor.g:第24:11行中的节点必需(…)+循环与输入“r”处的任何内容都不匹配
org\antlr\v4\parse\GrammarTreeVisitor.g:第24:15行中的节点不匹配树节点:n
org\antlr\v4\parse\GrammarTreeVisitor.g:第24:11行中的节点必需(…)+循环与输入“r”处的任何内容都不匹配
org\antlr\v4\parse\GrammarTreeVisitor.g:第24:15行中的节点不匹配树节点:n
错误(20):内部错误:规则字母未定义
错误(20):内部错误:元素列表的first | last==null
线程“main”java.lang.NullPointerException中出现异常
位于org.antlr.v4.automata.ParserATNFactory.elemList(ParserATNFactory.java:445)
位于org.antlr.v4.automata.ParserATNFactory.alt(ParserATNFactory.java:414)
位于org.antlr.v4.parse.ATNBuilder.alternative(ATNBuilder.java:567)
位于org.antlr.v4.parse.ATNBuilder.block(ATNBuilder.java:400)
位于org.antlr.v4.parse.ATNBuilder.subrule(ATNBuilder.java:1185)
位于org.antlr.v4.parse.ATNBuilder.element(ATNBuilder.java:887)
位于org.antlr.v4.parse.ATNBuilder.alternative(ATNBuilder.java:550)
位于org.antlr.v4.parse.ATNBuilder.ruleBlock(ATNBuilder.java:289)
位于org.antlr.v4.automata.ParserATNFactory.\u createATN(ParserATNFactory.java:148)
位于org.antlr.v4.automata.lexeranfactory.createATN(lexeranfactory.java:94)
位于org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:407)
位于org.antlr.v4.Tool.process(Tool.java:376)
位于org.antlr.v4.Tool.processGrammarsOnCommandLine(Tool.java:343)
位于org.antlr.v4.Tool.main(Tool.java:190)
那么,我的语法有什么问题


(请注意,这篇文章可能比我在文章中披露的更进一步,因为我在文章中出现了语法错误)。

有两件事出了问题:


为什么
标记值
周围有双引号?如果要匹配标记
TAG\u值
TAG:'['TAG\u TYPE TAG\u值'],请删除引号


如果要匹配文字
(点),需要在其周围加引号(而不是转义!):
移动\u编号。“”移动\u描述移动\u描述


同样,如果要匹配文本,请在其周围加引号:
NEWLINE:'\r'?'\n′


这些规则将吞噬整个输入流。与现在相比,您需要另一种方法来匹配标记值和移动描述。不要使用
*

编辑
这里有一个现有的PGN语法:

非常感谢。对于“TAG_值”,我希望捕获双引号中的一些内容,而不将它们提取到我的TAG_值lexer中。现在,另一个要点是避免使用两个wilcard(.*):因为我想匹配任何可打印字符,包括空格。我找到了可打印字符的[:print:]:现在需要一种方法来避免标记值周围的双引号。。。又一次没有抓住他们。
tag:        '['TAG_TYPE "TAG_VALUE"']';
MOVE_NUMBER\. MOVE_DESC MOVE_DESC
NEWLINE:    \r? \n;
TAG_VALUE: .*;  
...
MOVE_DESC: .*;