2013-09-03 2 views
0

Я строю своего рода предварительный процессор в ANTLRv3, который, конечно, работает только с нечетким разбором. На данный момент я пытаюсь разобрать включения операторов и заменить их соответствующим содержимым файла. Я использовал этот пример:ANTLR fuzzy parsing

ANTLR: removing clutter

На основе этого примера, я написал следующий код:

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, но и остальная часть кода. Я пробовал несколько других вещей, но не смог найти правильное решение.

ответ

1

Вы наблюдаете одно из ограничений ANTLR 3. Вы можете использовать любой из этих параметров для устранения проблемы:

  1. Обновите ANTLR 4, у которого нет этого ограничения.
  2. Включить следующий синтаксический предикат в начале INCLUDE_STAT правила:

    `('include' (' ' | '\r' | '\t' | '\n')+ ('A'..'Z' | 'a'..'z' | '_' | '-' | '.')+) =>` 
    
+0

Я просто попытался это синтаксический предикат, но он не работал - результат выглядит так же. – Andy

+0

Ну, я решил переехать в ANTLR4. Мой первый опыт заключается в том, что нечеткий синтаксический анализ работает очень хорошо, поэтому я принимаю ваш ответ. – Andy