2016-03-28 8 views
0

Antlr v4 Grammarsを見ていました。特にJavaの例ANTLR4ユーザー定義型の検証一致

https://github.com/antlr/grammars-v4/blob/master/java/Java.g4

私は、以下の入力を提供する文法を使用して有効であることに気づきました。

public class HelloWorld { 
    public static void main(String[] args) { 
     Float f = "hello world!"; 
    } 
} 

明らかに、これはJavaの有効なステートメントではありません。 Antlr4でこれを無効にしてエラーを投げますか?私はあなたがBaseVisitorで生成された関数でそれを行うと思うが、私はAntlr4の本またはオンラインで例を見つけるのに苦労している。

+0

パーサー(パーサジェネレータの結果)は、単にこれをしません。彼らは解析のみを処理し、実際のプログラムを分析するには十分に近いところにはありません。私のエッセイを参照してください "生命の後に解析"(私のバイオを介して、またはあなたはそれだけでGoogleをすることができます)。 –

答えて

1

特定のコンパイラに応じて、これはコンテキスト解析/型チェック - パーズツリーのウォークスルーで行われます。これは、ツリーを型で「装飾」することによって行われます。これは、 "文字列"を "hello world!"の型として入れます。ノード、および宣言ノードの "float"コンパイラは間違いを発見してエラーメッセージを出すことができます。

はい、それはANTLRで提供された訪問者で行われます。 BaseVisitorクラスを拡張して独自の訪問者メソッドを作成し、装飾と型チェックを行います。例は下に私自身のプロジェクトの一つから:

@Override 
public Node visitEqCond(EqCondNode node){ 
    CondNode left = (CondNode) visit(node.left); 
    CondNode right = (CondNode) visit(node.right); 

    if(left.type.equals("num") && right.type.equals("num") && left.typeCorrect && right.typeCorrect){ 
     node.type = "bool"; 
    } 
    else{ 
     node.typeCorrect = false; 
     if(!left.type.equals("num")){ 
      err.TypeNotApplicableInOperationError(left.type, node.operator, node.lineNumber); 
     } 
     if(!right.type.equals("num")){ 
      err.TypeNotApplicableInOperationError(right.type, node.operator, node.lineNumber); 
     } 
    } 
    return node; 
} 

明らかにこれは「タイプ」と「typeCorrect」属性を使用して独自のノードを作成してする必要があります。具体的には、この方法は非常に簡単です。特定の式にアクセスすると、そこにあるタイプに応じてタイプを設定します。たとえば、式は"hello world"の割り当ての一部です。私が特定のノードを訪問すると(それはStringExprと呼ばれています)、私はStringに "type"属性を設定し、私は "Float"に設定した割り当てノードに対して同じことを行います。私は、割り当てと表現が一致せず、エラーを投げることができます。

0

セマンティク述語を利用して行うことができます。 この記事をご覧ください:What is a 'semantic predicate' in ANTLR?

+0

実際にはこれを行うことはできません。第一に、意味論に必要な情報はまだ利用できないかもしれません(もしその情報が紛らわしい参照であれば?)。第二に、実際の言語の型互換性チェックは非常に複雑です。それらは、構文解析の削減中にチェックが実行されるときに実装できる述語に振り回されない傾向があります。 (この方法で実装されたプロダクション言語のフロントエンドを表示することは歓迎します。) –

関連する問題