ANTLR
Цели ANTLR / Язык Runtimes
Поиск…
Поддержка языков
ANTLR способен генерировать парсеры для ряда языков программирования:
- Цель C #
- Python Target
- Цель JavaScript
- Java-цель
По умолчанию ANTLR генерирует парсер из командной строки на языке программирования Java:
Java -jar antlr-4.5.3-complete.jar yourGrammar.g4 //Will output a
java parser
Чтобы изменить целевой язык, вы можете запустить следующую команду из терминала / командной строки OS:
antlr4 -Dlanguage=Python3 yourGrammar.g4
//with alias
java -jar antlr-4.5.3-complete.jar -Dlanguage=Python3 yourGrammar.g4
//without alias
Вместо того, чтобы каждый раз использовать параметр «-Dlanguage» в командной строке / терминале для создания нужного парсера для определенного языка, вы можете выбрать цель из вашего файла грамматики .g4, включив цель в глобальный раздел:
options {
language = "CSharp";
}
//or
options {
language="Python";
}
Чтобы использовать сгенерированный вывод синтаксического анализатора, убедитесь, что время выполнения ANTLR для указанного языка:
Полные инструкции и информация о библиотеках времени выполнения ANTLR
Настройка парсера Python
После запуска вашего файла грамматики .g4 с помощью ANTLR.jar вам необходимо создать несколько файлов, например:
1.yourGrammarNameListener.py
2.yourGrammarNameParser.py
3.yourGrammarName.tokens
...
Чтобы использовать их в проекте python, используйте среду исполнения Python в рабочей области, чтобы любое приложение, которое вы разрабатываете, может получить доступ к библиотеке ANTLR. Это можно сделать, извлекая среду выполнения в текущую папку проекта или импортируя ее в свою среду IDE в зависимости от проекта.
#main.py
import yourGrammarNameParser
import sys
#main method and entry point of application
def main(argv):
"""Main method calling a single debugger for an input script"""
parser = yourGrammarNameParser
parser.parse(argv)
if __name__ == '__main__':
main(sys.argv)
Эта настройка включает в себя ваш синтаксический анализатор и принимает входные данные из командной строки, чтобы разрешить обработку файла, переданного в качестве параметра.
#yourGrammarNameParser.py
from yourGrammarNameLexer import yourGrammarNameLexer
from yourGrammarNameListener import yourGrammarNameListener
from yourGrammarNameParser import yourGrammarNameParser
from antlr4 import *
import sys
class yourGrammarNameParser(object):
"""
Debugger class - accepts a single input script and processes
all subsequent requirements
"""
def __init__(self): # this method creates the class object.
pass
#function used to parse an input file
def parse(argv):
if len(sys.argv) > 1:
input = FileStream(argv[1]) #read the first argument as a filestream
lexer = yourGrammarNameLexer(input) #call your lexer
stream = CommonTokenStream(lexer)
parser = yourGrammarNameParser(stream)
tree = parser.program() #start from the parser rule, however should be changed to your entry rule for your specific grammar.
printer = yourGrammarNameListener(tree,input)
walker = ParseTreeWalker()
walker.walk(printer, tree)
else:
print('Error : Expected a valid file')
Эти файлы в сочетании с временем выполнения ANTLR и вашими файлами, созданными из вашего файла грамматики, будут принимать одно имя файла в качестве аргумента и читать и анализировать ваши правила грамматики.
Чтобы расширить базовую функциональность, вы также должны расширять приемник по умолчанию для обработки соответствующих событий для токенов, встречающихся во время выполнения.