特定のコンパイラに応じて、これはコンテキスト解析/型チェック - パーズツリーのウォークスルーで行われます。これは、ツリーを型で「装飾」することによって行われます。これは、 "文字列"を "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"に設定した割り当てノードに対して同じことを行います。私は、割り当てと表現が一致せず、エラーを投げることができます。
パーサー(パーサジェネレータの結果)は、単にこれをしません。彼らは解析のみを処理し、実際のプログラムを分析するには十分に近いところにはありません。私のエッセイを参照してください "生命の後に解析"(私のバイオを介して、またはあなたはそれだけでGoogleをすることができます)。 –