{"id":90,"date":"2007-07-24T11:08:00","date_gmt":"2007-07-24T11:08:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=90"},"modified":"2007-07-24T11:08:00","modified_gmt":"2007-07-24T11:08:00","slug":"das-antlr-eclipse-plugin","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2007\/07\/das-antlr-eclipse-plugin\/","title":{"rendered":"Das ANTLR Eclipse-Plugin"},"content":{"rendered":"<p>F\u00fcr den beliebten Parsergenerator ANTLR gibt es unter <a title=\"http:\/\/www.javadude.com\/tools\/antlr3-eclipse\/\" href=\"http:\/\/www.javadude.com\/tools\/antlr3-eclipse\/\">http:\/\/www.javadude.com\/tools\/antlr3-eclipse\/<\/a>&nbsp;ein praktisches Plugin. Der Update-Manger von Eclipse wird auf die URL <a href=\"http:\/\/javadude.com\/eclipse\/update\">http:\/\/javadude.com\/eclipse\/update<\/a>&nbsp;gelegt, installiert und neu gestartet. Anschlie\u00dfend geht man im Projekt auf das Kontextmen\u00fc und aktiviert <b>Add\/Remove ANTLR 3 Nature<\/b>.<\/p>\n<p>Als n\u00e4chstes kann man eine ANTLR-Datei ablegen. Auf der Doku-Seite vom Plugin wird eine Grammatik (Datei <em>Expr.g3<\/em>) angegeben, die hier &#8212; leicht \u00fcberarbeitet &#8212; angegeben werden soll:<\/p>\n<pre>grammar Expr;<br \/><br \/>@header {<br \/>package com.tutego.script.fp;<br \/><br \/>import java.util.HashMap;<br \/>}<br \/><br \/>@lexer::header {<br \/>package com.tutego.script.fp;<br \/>}<br \/><br \/>@members {<br \/>  HashMap&lt;String,Integer&gt; memory = new HashMap&lt;String,Integer&gt;();<br \/>}<br \/><br \/>prog:<br \/>  stat +<br \/> ;<br \/><br \/>stat:<br \/>  expr NEWLINE<br \/>  {<br \/>    System.out.println( $expr.value );<br \/>  }<br \/><br \/>    |   ID '=' expr NEWLINE<br \/>        {<br \/>          memory.put( $ID.text, $expr.value );<br \/>        }<br \/><br \/>    |   NEWLINE<br \/>    ;<br \/><br \/>expr returns [int value]:<br \/><br \/>        e = multExpr { $value = $e.value; }<br \/>        (<br \/>    '+' e = multExpr { $value += $e.value; }<br \/>   |   '-' e = multExpr { $value -= $e.value; }<br \/>        )*<br \/>    ;<br \/><br \/>multExpr returns [int value]:<br \/><br \/>        e = atom { $value = $e.value; }<br \/>        (<br \/>          '*' e = atom { $value *= $e.value; }<br \/>        )*<br \/>    ; <br \/><br \/>atom returns [int value]:<br \/><br \/>        INT<br \/>        {<br \/>         $value = Integer.parseInt($INT.text);<br \/>        }<br \/>   <br \/>    |   ID<br \/>        {<br \/>          Integer v = memory.get( $ID.text );<br \/>          if ( v!=null ) $value = v.intValue();<br \/>          else System.err.println( \"Undefined variable \" + $ID.text );<br \/>        }<br \/>        <br \/>    |   '(' expr ')' {$value = $expr.value;}<br \/>    ;<br \/><br \/>ID:<br \/>  ('a'..'z' | 'A'..'Z') +<br \/> ;<br \/><br \/>INT:<br \/>  '0'..'9' +<br \/> ;<br \/><br \/>NEWLINE:<br \/>  '\\r' ? '\\n'<br \/> ;<br \/><br \/>WS:<br \/>  (' ' | '\\t') +<br \/>  {<br \/>   skip();<br \/>  }<br \/> ;<br \/><br \/><\/pre>\n<p><\/p>\n<p>Bearbeiten l\u00e4sst sich die Grammatik in Eclipse nicht ordentlich, doch daf\u00fcr dient ja die <a href=\"http:\/\/www.antlr.org\/works\/index.html\">ANTLRWorks: The ANTLR GUI Development Environment<\/a>. <\/p>\n<p>Das Sch\u00f6ne beim Plugin: Es generiert automatisch im Hintergrund den Parser und Lexer. Das Testprogramm ist schnell geschrieben: <\/p>\n<pre>package com.tutego.script.fp; <br \/><p>import org.antlr.runtime.*; <br \/><p>public class FpRunner<br \/>{<br \/>public static void main( String[] args ) throws Exception<br \/>{ <br \/>ExprLexer lex = new ExprLexer( new ANTLRStringStream(\"age=34\\nage*2\\n12*111\\n\") ); <br \/><p>ExprParser parser = new ExprParser( new CommonTokenStream( lex ) ); <br \/><p>try<br \/>{<br \/>parser.prog();<br \/>}<br \/>catch ( RecognitionException e )<br \/>{<br \/>e.printStackTrace();<br \/>}<br \/>}<br \/>}<\/p><\/pre>\n<p><\/p>\n<p>Die Ausgabe ist dann <\/p>\n<p>68<br \/>1332<\/p>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr den beliebten Parsergenerator ANTLR gibt es unter http:\/\/www.javadude.com\/tools\/antlr3-eclipse\/&nbsp;ein praktisches Plugin. Der Update-Manger von Eclipse wird auf die URL http:\/\/javadude.com\/eclipse\/update&nbsp;gelegt, installiert und neu gestartet. Anschlie\u00dfend geht man im Projekt auf das Kontextmen\u00fc und aktiviert Add\/Remove ANTLR 3 Nature. Als n\u00e4chstes kann man eine ANTLR-Datei ablegen. Auf der Doku-Seite vom Plugin wird eine Grammatik (Datei Expr.g3) [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[7],"tags":[8],"class_list":["post-90","post","type-post","status-publish","format-standard","hentry","category-entwicklungsumgebung","tag-eclipse"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=90"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/90\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}