Это похоже на ошибку в ANTLRWorks 1.4. Вы можете попробовать использовать ATLRWorks 1.3 (или более раннюю версию), возможно, эта версия работает правильно (я сделал быструю проверку только с v1.4!).
В консоли обе ваши примеры ("abc"
и "\nabc"
) анализируются без каких-либо проблем. Вот мой тестовый стенд и соответствующий вывод:
grammar test;
start
: STRING {System.out.println("parsed :: "+$STRING.text);} EOF
;
WS
: (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;}
;
STRING
: '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
;
fragment
HEX_DIGIT
: ('0'..'9'|'a'..'f'|'A'..'F')
;
fragment
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| UNICODE_ESC
| OCTAL_ESC
;
fragment
OCTAL_ESC
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
fragment
UNICODE_ESC
: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
;
Обратите внимание, что грамматика такая же, как у вас, только немного отформатированная.
И «основной» класс:
import org.antlr.runtime.*;
public class Demo {
public static void main(String[] args) throws Exception {
ANTLRStringStream in = new ANTLRStringStream(args[0]);
testLexer lexer = new testLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
testParser parser = new testParser(tokens);
parser.start();
}
}
Теперь из консоли вы создаете парсер и лексер:
java -cp antlr-3.2.jar org.antlr.Tool test.g
Скомпилируйте все исходные файлы .java:
javac -cp antlr-3.2.jar *.java
и запустить «основной» класс:
java -cp .:antlr-3.2.jar Demo \"\\nabc\"
// output: parsed :: "\nabc"
java -cp .:antlr-3.2.jar Demo \"abc\"
// output: parsed :: "abc"
(для Windows замените :
на ;
в приведенных выше командах)
Обратите внимание, что приведенные выше параметры командной строки являются примерами, запускаемыми на Bash, где необходимо экранировать "
и \
: это может отличаться в вашей системе. Но, как видно из вывода: и "\nabc"
, и "abc"
обрабатываются правильно.
ANTLRWorks - отличный инструмент для редактирования файлов грамматики, но (по моему опыту) в нем довольно много таких забавных ошибок. Вот почему я редактирую только грамматику (ы) и генерирую, компилирую и тестирую файлы на консоли, как я вам показал.
НТН