Я строю своего рода предварительный процессор в ANTLRv3, который, конечно, работает только с нечетким разбором. На данный момент я пытаюсь разобрать включения операторов и заменить их соответствующим содержимым файла. Я использовал этот пример:ANTLR fuzzy parsing
На основе этого примера, я написал следующий код:
grammar preprocessor;
options {
language='Java';
}
@lexer::header {
package antlr_try_1;
}
@parser::header {
package antlr_try_1;
}
parse
: (t=. {System.out.print($t.text);})* EOF
;
INCLUDE_STAT
: 'include' (' ' | '\r' | '\t' | '\n')+ ('A'..'Z' | 'a'..'z' | '_' | '-' | '.')+
{
setText("Include statement found!");
}
;
Any
: . // fall through rule, matches any character
;
Эта грамматика делает только для печати текста и заменить заявления включают в себя с «Включать заявление найденный!" строка. Пример текста, который будет проанализирован выглядит следующим образом:
some random input
some random input
some random input
include some_file.txt
some random input
some random input
some random input
Выходной результат выглядит следующим образом:
C:\Users\andriyn\Documents\SandBox\text_files\asd.txt line 1:14 mismatched character 'p' expecting 'c'
C:\Users\andriyn\Documents\SandBox\text_files\asd.txt line 2:14 mismatched character 'p' expecting 'c'
C:\Users\andriyn\Documents\SandBox\text_files\asd.txt line 3:14 mismatched character 'p' expecting 'c'
C:\Users\andriyn\Documents\SandBox\text_files\asd.txt line 7:14 mismatched character 'p' expecting 'c'
C:\Users\andriyn\Documents\SandBox\text_files\asd.txt line 8:14 mismatched character 'p' expecting 'c'
C:\Users\andriyn\Documents\SandBox\text_files\asd.txt line 9:14 mismatched character 'p' expecting 'c'
some random ut
some random ut
some random ut
Include statement found!
some random ut
some random ut
some random ut
Насколько я могу судить, это смущает «в» в слове «вход», потому что он «думает», это будет токен INCLUDE_STAT.
Есть ли лучший способ сделать это? Опция фильтра, которую я не могу использовать, поскольку мне нужны не только операторы include, но и остальная часть кода. Я пробовал несколько других вещей, но не смог найти правильное решение.
Я просто попытался это синтаксический предикат, но он не работал - результат выглядит так же. – Andy
Ну, я решил переехать в ANTLR4. Мой первый опыт заключается в том, что нечеткий синтаксический анализ работает очень хорошо, поэтому я принимаю ваш ответ. – Andy