ANTLRã¨ã¯
ãã¼ãµã¸ã§ãã¬ã¼ã¿ãANTLRã¡ã¿è¨èªããLexer, Parser, Tree-Parserãçæããããã¨ãã§ãããJavaã§åããã¿ã¼ã²ããè¨èªã¯C#,C++,Java,PythonãANTLR 3.0ã¯éçºä¸ã§ãANTLRã¡ã¿è¨èªã®ä»æ§ãå¤ãããã¿ã¼ã²ããè¨èªã«C,Objective C, Ruby, LISP, Perl6, PHP, Oberonãå ãããããªãªã¼ã¹ã¯ã¾ã å ã«ãªããããæ¥æ¬èªã®æ å ±ãã»ã¨ãã©ãªãã
ANTLR Parser Generator
http://www.antlr.org/
ANTLRã®ã¤ã³ã¹ãã¼ã«
ç°å¢
ç°å¢ã¯ä»¥ä¸ã®éãã¨ããã
- Fedora Core 6
- bash
- JDK 1.6.0_01
- ã¿ã¼ã²ããè¨èªã¯Javaã¨C++
gijã ã¨ãã¾ããããªãã£ãã®ã§ãSunã®ãµã¤ãããJDKããã¦ã³ãã¼ããã¦ã¤ã³ã¹ãã¼ã«ãã¦ããå¿ è¦ãããã
ãã«ã
以ä¸ã®æé ã§è¡ã£ãã
$ cd antlr-2.7.7 $ ./configure --disable-csharp --disable-python ... $ make ...
ç§ã使ç¨ãã¦ããç°å¢ã§ã¯C#ã¨Paythonãã¤ã³ã¹ãã¼ã«ãã¦ããªãã®ã§ãä¸è¨ã®ããã«configureã®å®è¡æã«ç¡å¹ã«ããã
ãã¹ã
以ä¸ã®æé ã§è¡ã£ãã
$ cd examples $ make ...
*.gãã¡ã¤ã«ãããã¼ãµã½ã¼ã¹ãçæããã³ã³ãã¤ã«ãã¦å®è¡ãããéä¸ã§Warningã¯å¤ãçºçããããã¨ã©ã¼ããªããã°ãã«ãã¯åé¡ãªãçµäºãããã¨ã確èªã§ããã
Getting Started with ANTLR
è¨èªå®ç¾©ãã¡ã¤ã«ã®ä½æ
å®éã«ææ³ãå®ç¾©ãã¦ããã¼ãµãçæãã¦ã¿ãã
以ä¸ã®ãã¼ã¸ãåèã«ããã
Getting Started with ANTLR
http://www.antlr.org/doc/getting-started.html
以ä¸ã®å 容ãè¨è¿°ãããã¡ã¤ã«ãä½æãããä»®ã«ãã¡ã¤ã«åã¯t.gã¨ããã
class P extends Parser; startRule : n:NAME {System.out.println("Hi there, "+n.getText());} ; class L extends Lexer; // one-or-more letters followed by a newline NAME: ( 'a'..'z'|'A'..'Z' )+ NEWLINE ; NEWLINE : '\r' '\n' // DOS | '\n' // UNIX ;
ç°å¢å¤æ°CLASSPATHã®è¨å®
ANTLRãèµ·åããåã«ãç°å¢å¤æ°CLASSPATHãè¨å®ããã
$ export CLASSPATH=<install dir>/antlr-2.7.7/antlr.jar:$CLASSPATH
ANTLRã®èµ·å
以ä¸ã®ã³ãã³ããå®è¡ãããå ã»ã©ä½æããè¨èªå®ç¾©ãã¡ã¤ã«ã¯ãã«ã¬ã³ããã£ã¬ã¯ããªã«ãããã®ã¨ããã
$ java antlr.Tool t.g ANTLR Parser Generator Version 2.7.7 (2006-11-01) 1989-2005 $ ls L.java L.smap P.java P.smap PTokenTypes.java PTokenTypes.txt t.g $
ãã¼ãµã®èµ·åããã°ã©ã ãä½æ
以ä¸ã®ãã¡ã¤ã«ãä½æããããã¡ã¤ã«åãMain.javaã¨ããã
import java.io.*; class Main { public static void main(String[] args) { try { L lexer = new L(new DataInputStream(System.in)); P parser = new P(lexer); parser.startRule(); } catch(Exception e) { System.err.println("exception: "+e); } } }
ã³ã³ãã¤ã«
以ä¸ã®ããã«ã³ã³ãã¤ã«ãå®è¡ããã
$ javac *.java ... ^^^^^^^^^^^^^^^^^^^^^^^ The import antlr.SemanticException is never used ---------- 17 problems (17 warnings)$ ls L.class L.smap Main.java P.java PTokenTypes.class PTokenTypes.txt L.java Main.class P.class P.smap PTokenTypes.java t.g $
Warningã¡ãã»ã¼ã¸ãããããã§ã¦ããããã¨ããããclassãã¡ã¤ã«ã¯çæãããã
å®è¡
ããããå®è¡ãã¦ã¿ããå ¥åå¾ ã¡ã«ãªã£ã¦ããã®ã§ã"takane"ã¨æã¡è¾¼ãã§ãªã¿ã¼ã³ãã¼ãæ¼ãã¨ã¡ãã»ã¼ã¸ã表示ããã¦çµäºããã
$ java Main takane Hi there, takane $
以ä¸ã®ãããªã¡ãã»ã¼ã¸ã表示ããããªãã°ãCLASSPATHã«ã«ã¬ã³ããã£ã¬ã¯ããªã追å ããã
$ java Main Exception in thread "main" java.lang.NoClassDefFoundError: Main at gnu.java.lang.MainThread.run(libgcj.so.7rh) Caused by: java.lang.ClassNotFoundException: Main not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:.../antlr-2.7.7/antlr.jar], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}} at java.net.URLClassLoader.findClass(libgcj.so.7rh) at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh) at java.lang.ClassLoader.loadClass(libgcj.so.7rh) at java.lang.ClassLoader.loadClass(libgcj.so.7rh) at gnu.java.lang.MainThread.run(libgcj.so.7rh)
ç°å¢å¤æ°CLASSPATHã«ã«ã¬ã³ããã£ã¬ã¯ããªã追å ã
> |
Cè¨èªãã¼ãµ
cgramã®ãã¦ã³ãã¼ã
ANTLRã®ãã¼ã¸http://www.antlr.org/ ãè²ã ã¨èª¿ã¹ã¦ã¿ãã¨ãããã¤ãã®ææ³ãã¡ã¤ã«ããã¦ã³ãã¼ãã§ãããä»åã¯ããã®ãã¡ã®Cè¨èªãã¼ãµ(cgram)ã®ãã«ããè¡ããç°å¢è¨å®ã«ã¤ãã¦ã¯ããã§ã«èª¬æãããã®ãå©ç¨ããã
åèï¼http://d.hatena.ne.jp/takaneh/20070507#1178533339
以ä¸ã®ãã¼ã¸ããcgramããã¦ã³ãã¼ãããã
Files in diredtory /grammer/cgram
http://www.antlr.org/grammar/cgram
ãã¦ã³ãã¼ããããã¡ã¤ã«ã¯cgram.tgzã
cgramã®ãã«ã
tgzãã¡ã¤ã«ãå±éãã¦makeããã
$ tar xvfz cgram.tgz ... $ cd cgram $ ls announce.txt examples/ grammars/ license.txt readme.txt tests/ todo.txt $ cd grammars $ ls CSymbolTable.java GnuCTreeParser.g StdCParser.g CToken.java LineObject.java TNode.java GnuCEmitter.g Makefile TNodeFactory.java GnuCParser.g PreprocessorInfoChannel.java $ make ... The serializable class TNode does not declare a static final serialVersionUID field of type long ---------- 18 problems (1 error, 17 warnings)make: *** [StdCParser.class] Error 255 $
å®ã¯ãã®ã¾ã¾ã§ã¯ã¨ã©ã¼ãçºçããã以ä¸ã®ç®æãã³ã¡ã³ãã¢ã¦ãããã¨ããã
StdCParser.g 913 { 914 // import CToken; // ã³ã¡ã³ãã¢ã¦ã 915 import java.io.*; 916 // import LineObject; // ã³ã¡ã³ãã¢ã¦ã 917 import antlr.*; 918 } GnuCParser.g 614 { 615 // import CToken; // ã³ã¡ã³ãã¢ã¦ã 616 import java.io.*; 617 // import LineObject; // ã³ã¡ã³ãã¢ã¦ã 618 import antlr.*; 619 } TNode.java 9 //import CToken; // ã³ã¡ã³ãã¢ã¦ã
ä¸è¨ã®å¤æ´å¾ãåã³makeãå®è¡ããã¨ã¨ã©ã¼ãçºçããªãã¯ãããã ããç¸å¤ãããWarningã¯å¤§éã«åºãã
å®è¡
ãã£ã¬ã¯ããªexamplesã«ç§»åããCLASSPATHãè¨å®ãã¦makeããã
以ä¸ã®ä¾ã¯ããµã³ãã«Cããã°ã©ã ãèªã¿è¾¼ã¿ãåºåããã
$ cd ../examples $ export CLASSPATH=../grammars:$CLASSPATH $ make ... 4 problems (4 warnings) $ ls GNUCTokenTypes.txt@ Test.class TestLex.class TestThrough.class Makefile Test.java TestLex.java TestThrough.java $ java Test ../tests/test.c static int g1 = 0 ; typedef long mylong ; static mylong z ; typedef int Length ; Length len , maxlen ; Length * lengths [ ] ; typedef char * String ; String p , lineptr [ 100 ] , alloc ( int ) ; int strcmp ( String , String ) ;
ã¡ãªã¿ã«å ã®ãã¡ã¤ã«ãè¦ã¦ã¿ãã¨ã注éè¡ãåé¤ããã¦ããã
$ cat ../tests/test.c static int g1 = 0; typedef long mylong; static mylong z; typedef int Length; Length len, maxlen; Length *lengths[]; typedef char *String; String p, lineptr[100], alloc(int); int strcmp(String, String); /* typedef struct tnode *Treeptr; typedef struct tnode { char *word; int count; Treeptr left; Treeptr right; } Treenode; Treeptr talloc(void) { return (Treeptr) malloc(sizeof(Treenode)); } int fun(int a, mylong b) { mylong c; return a+b; } */ $