2015-10-07 3 views
1

У меня есть большой файл грамматики и планируем разбить его на несколько, чтобы я мог повторно использовать некоторые из этих небольших файлов в другом файле грамматики. Я попытался сделать это, но потерпел неудачу. Не могли бы вы рассказать, доступна ли такая функция, и если да, пожалуйста, направьте меня к примеру.Как разбить файл грамматики ANTLR на несколько из них

ответ

1

Вы не упомянули версию ANTLR, поэтому я собираюсь предположить, что вы используете текущий - 4.x. В ANTLR4 грамматики могут быть импортированы с ключевым словом import. Что-то вроде этого:

Файл: CommonLexerRules.g4

lexer grammar CommonLexerRules; 

ID : [a-zA-Z]+ ; 
... 

Файл: MyParser.g4

grammar MyParser;  
import CommonLexerRules; //includes all rules from lexer CommonLexerRules.g4 
... 

Правила в «основных грамматику» правил отменяют с импортируемыми грамматик для реализации наследования. Подробнее см. Здесь: https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Grammar+Structure#GrammarStructure-GrammarImports

+0

Да, версия, которую я использую, - antlr4.5-opt. Когда я пытаюсь ссылаться на правило в импортированной грамматике в основной грамматике, я получаю это сообщение об ошибке: ссылка на неопределенное правило: temp_rule (com.tunnelvisionlabs: antlr4-maven-plugin: 4.5: antlr4: default: generate-sources) –

+0

попытайтесь уменьшить ваши импортированные и основные файлы грамматики до абсолютного минимума, просто чтобы продемонстрировать ошибку и добавить содержимое файла в ваш исходный вопрос – user3890638

0

Если вы хотите разделить лексер и парсер.

Лексер:

lexer grammar HelloLexer; 
Hello : 'hello' ; 
ID : [a-z]+ ;    // match lower-case identifiers 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 

Parser:

parser grammar HelloParser; 
options { tokenVocab=HelloLexer; } 
r : Hello ID ;  

Не забудьте назвать файлы HelloLexer.g4 и HelloParser.g4

если вы хотите импортировать всю грамматику, то вы должны используйте ключевое слово импорта

grammar Hello; 

import OtherGrammar; 

Hello : 'hello' ; 
ID : [a-z]+ ;    // match lower-case identifiers 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines  
r : Hello ID ; 
+1

, не следует ли ему «импортировать HelloParser;»? – Boriel

Смежные вопросы