サーチ…


言語サポート

ANTLRは、多くのプログラミング言語用のパーサを生成することができます。

  1. C#ターゲット
  2. Pythonターゲット
  3. JavaScriptターゲット
  4. 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ランタイムがあることを確認してください。

  1. CSharpランタイム
  2. Python 2ランタイム
  3. Python 3ランタイム

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ランタイムと結合され、文法ファイルから生成されたファイルは引数として単一のファイル名を受け取り、文法規則を読み込んで解析します。

基本機能を拡張するには、デフォルトのリスナーを拡張して、実行時に発生するトークンに関する関連イベントを処理する必要があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow