프로그램 사용/antlr2012. 2. 23. 21:25
lexer(어휘분석기)는 token을 구분해내고
paser(구문분석기)는 lexer가 구분해낸 token의 문법구조를 분석한다.
아래예제에서 startRule()은 .g(rule)파일에서 가장 처음 규칙을 지칭한다.

int main(int argc,char** argv)
{
  try {
    std::ifstream inputstream("test.c", std::ifstream::in);
    MLexer* mainLexer = new MLexer(inputstream);
    mainLexer->setFilename("test.c");
    
    parser = new PParser(*mainLexer);
    parser->setFilename("test.c");
    gCurrentInputStream = &inputstream;
    parser->startRule();
  }
  catch(exception& e) {
    cerr << "exception: " << e.what() << endl;
  }
return 0;
}


int main(int argc,char** argv)
{
  try {
    … // 어휘 분석기/구문 분석기를 설정하기 위한 코드
    parser->startRule();
  }
  catch(ANTLR_USE_NAMESPACE(antlr)RecognitionException& e) {
    // 필요한 작업 수행
  }
  catch(ANTLR_USE_NAMESPACE(antlr)TokenStreamException& e) { 
    // 필요한 작업 수행
  }
return 0;
}

[링크 : http://www.ibm.com/developerworks/kr/library/tutorial/au-parsingwithantlr/index.html]
     [링크 : http://www.ibm.com/developerworks/kr/library/tutorial/au-parsingwithantlr/section5.html]

'프로그램 사용 > antlr' 카테고리의 다른 글

java를 이용한 antlr AST 탐색하기(AST navigation)  (0) 2011.11.02
ANTLR IDE 2.1.2 for ANTLR 3.0 above  (0) 2011.11.02
antlrworks  (0) 2011.11.02
antlr + eclipse & java  (0) 2011.10.30
antlr / pccts package  (0) 2011.10.24
Posted by 구차니
프로그램 사용/antlr2011. 11. 2. 21:59
학교에 있을때도 잘 안다루던 java라서 import 하나하나 해주고
exception 처리해주는게 익숙하지가 않아서 힘들다 ㅠ.ㅠ

import java.io.*;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class antlrtest{

/**
 * @param args
 */

public static void printTree(CommonTree t, int indent) {
if (t != null) {
StringBuffer sb = new StringBuffer(indent);
for (int i = 0; i < indent; i++)
sb = sb.append("   ");
for (int i = 0; i < t.getChildCount(); i++) {
if(t.getChild(i).toString().matches(".*Manager"))
{
System.out.println(sb.toString() + t.getChild(i).toString());
printTree((CommonTree) t.getChild(i), indent + 1);
}
}
}
}

public static void main(String[] args) {
// TODO Auto-generated method stub
try {
JavaLexer theLexer = new JavaLexer(new ANTLRFileStream(args[0]));
CommonTokenStream theTokenStream = new CommonTokenStream(theLexer);
JavaParser Parser = new JavaParser(theTokenStream);
CommonTree tree = (CommonTree) Parser.compilationUnit().getTree();
printTree(tree,1);
DOTTreeGenerator gen = new DOTTreeGenerator();
StringTemplate st = gen.toDOT(tree);
// System.out.println(st);
} catch (IOException | RecognitionException inException) {
inException.printStackTrace();
}
}

[링크 : http://www.antlr.org/wiki/display/ANTLR3/Tree+construction]
[링크 : http://www.antlr.org/wiki/display/ANTLR3/Interfacing+AST+with+Java]
[링크 : http://antlr.1301665.n2.nabble.com/Inconsistent-Parse-Results-td3018499.html]
[링크 : http://stackoverflow.com/questions/4931346/how-to-output-the-ast-built-using-antlr]

'프로그램 사용 > antlr' 카테고리의 다른 글

antlr을 이용한 구문분석(parsing)하기  (0) 2012.02.23
ANTLR IDE 2.1.2 for ANTLR 3.0 above  (0) 2011.11.02
antlrworks  (0) 2011.11.02
antlr + eclipse & java  (0) 2011.10.30
antlr / pccts package  (0) 2011.10.24
Posted by 구차니
프로그램 사용/antlr2011. 11. 2. 10:42
Eclipse Plugin으로 존재하는 녀석이 있는데, 일단 ANTLR 3.0을 지원하니
2.7.6만 지원하는 sourceforge의 plugin보다는 훨신 나은듯 하다.
[링크 : http://antlreclipse.sourceforge.net/] << 2.7.6
[링크 : http://marketplace.eclipse.org/content/antlr-ide] << 얘가 걔임


Step 1. "Eclipse - Help - Eclipse MarketPlace..." 클릭


Step 2. "antlr"로 검색 "ANTLR IDE"를 설치함


Step 3. 조금 많이 기다리면 로딩하고 목록이 죽죽죽 나오는데


Step 4. "I accept...' 해주고 Finish 하면 설치 시작


Step 5. 설치가 진행되다 보면


Step 6. 경고가 뜨지만 Yes 해주고 대충 넘어가고


Step 7. 설치가 끝나면 플러그 인으로 인해서 Eclipse Restart 해달라는데 일단 해주고 패스~
Step 8. 그 다음 프로젝트 하나 생성해서 .g 파일을 추가하고 처음 클릭하면 아래와 같이 설정 화면이 나오게 된다.
           여기서는 위의 Installed Packages의 "Add..."를 눌러준다.


Step 9. ANTLR.jar이 있는 경로를 추가해주어야 하므로 Directory를 눌러서
           다운로드 받은 antlr-3.4-complete.jar 파일이 존재하는 경로를 선택해준다.


Step 10. 대충 찾아서 선택하고 "OK" 눌러주면


Step 11. 머라고 궁시렁 궁시렁 나오지만 대충 패스. 가장 아래 OK 눌러주고 나온다.


Step 12. "*.g" 파일은 아이콘도 프로젝트에서 변경되며, 하단의 Railroad view를 누르면
             아래와 같은 다이어그램을 볼수 있게 된다.



Step 13. 이제 antlr로 *.g 파일을 통해 Parser와 Lexer를 만들려면 "External Tools Configuration'을 설정해주어야 한다.
[링크 : http://www.oursland.net/tutorials/antlr/AntlrEclipse.html]


Step 14. 일단 jar을 원래 Java 내에 넣거나 classpath 환경변수를 정해줘야 하는데 아직 그건 모르니 패스 -ㅁ-
            개략적인 설정방법은 아래의 캡쳐를 참고하여 입력.. OTL
            (antlr v3의 경우 org.antlr.Tool 이고 v2에서는 antlr.Tool로 설정된다) 


머.. 이걸로 어떻게 써먹을지는 일단 별개 -ㅁ-

다운로드 링크
[링크 : http://antlr.org/grammar/list]
    [링크 : http://openjdk.java.net/projects/compiler-grammar/antlrworks/Java.g] Java 1.6 / antlr 3.x
    [링크 : http://antlr.org/grammar/1207932239307/Java1_5Grammars] Java 1.5 / antlr 3.x / Tree grammar
[링크 : http://antlr.org/download]
    [링크 : http://antlr.org/download/antlr-3.4-complete.jar] antlr 3.4 버전 jar 파일
 

'프로그램 사용 > antlr' 카테고리의 다른 글

antlr을 이용한 구문분석(parsing)하기  (0) 2012.02.23
java를 이용한 antlr AST 탐색하기(AST navigation)  (0) 2011.11.02
antlrworks  (0) 2011.11.02
antlr + eclipse & java  (0) 2011.10.30
antlr / pccts package  (0) 2011.10.24
Posted by 구차니
프로그램 사용/antlr2011. 11. 2. 09:16
AntlrWorks는 Antlr을 돌리기 위한 IDE 인데
별다른 실행파일도 없고 설치도 없고 어떻게 써야 하나 antlr도 잘 모르는데.. 고민을 하다
에잇 지르고 보자! 하고 다운받아보니 꼴랑 3.4MB 짜리 jar 파일 -ㅁ-


jar 답게(?) 실행방법은 콘솔에서 하면된다.
 C:\> java -jar antlrworks-1.4.3.jar

그럼 아래와 같이 짜잔~


[링크 : http://www.antlr.org/works/help/tutorial/howtorun.html]
[링크 : http://www.antlr.org/download/antlrworks-1.4.3.jar]
Posted by 구차니
프로그램 사용/antlr2011. 10. 30. 16:26
ANTLR 정리 -_-
.g 파일은 grammar(rule) 파일이며, gammar 링크에서 받을수 있다.
그런데 1.5 버전의 java 문법파일을 받아서 해봤는데 흐음.. 진척이 없네 -_-
나의 경우에는 아래의 순서로 진행하였다.

$ cd ~
$ wget "http://www.antlr.org/download/antlr-3.3-complete.jar"
$ wget "http://www.antlr.org/grammar/1207932239307/Java1_5Grammars/Java.g" 
$ export CLASSPATH=~/antlr-3.3-complete.jar:$CLASSPATH
$ java org.antlr.Tool Java.g
$ javac *.java 

그나저나 우분투에서 pccts에서 추가한 독립형 antlr 프로그램은 사용할줄 모르겠음 

 
Eclipse 에서는 Help의 Install New Software를 통해 설치가 가능한데
문제는 이녀석에서는 org.antlr.Tool이 설치가 안되는 듯 하다.


Add 누르고 "http://antlreclipse.sourceforge.net/updates/" 주소를 추가해서 진행


그냥 Next Next Finish 하면 끝


윈도우에서는 별다른 문제없이 추가가 되지만 리눅스에서는 퍼미션 문제인지
$ sudo eclipse로 해서 진행을 해야 추가가 되엇다.
물론 java 의 패키지 경로에 추가 되는게 아니니 실행은 별도의 classpath로 잡아주어야 한다.

Eclipse 에서 Package Explorer의 프로젝트 이름에서 아래와 같이 토글해주면


antlr.jar이 프로젝트에 추가된다.

근데 쓸줄은 모름 -ㅁ-

[링크 : http://antlreclipse.sourceforge.net]
[링크 : http://www.oursland.net/tutorials/antlr/AntlrEclipse.html ]

netbeans 관련 antlr 플러그인이라는데.. 일단 패스
[링크 : http://wiki.netbeans.org/AntlrInNetBeansJavaApplication]


-----

eclipse용 antlr plugin 설명을 보면 보이다 시피
org.antlr                       ANTLR 2.7.6 (official) library
org.antlr.doc                 ANTLR 2.7.6 (official) documentation
org.antlr.eclipse.core     ANTLR project nature with builder
org.antlr.eclipse.ui         ANTLR-aware text editor (associated to files with extension '*.g') 

2.7.6 구버전이 포함되어 있다.
즉, antlr v2로 작동하는 플러그인이므로 antrl v3 용 문법은 오류가 난다.
(grammar Java; 이런것이  unexpected token으로 오류남)

Updated Java 1.5 Grammar << 요런거 받아서 해야함 

'프로그램 사용 > antlr' 카테고리의 다른 글

java를 이용한 antlr AST 탐색하기(AST navigation)  (0) 2011.11.02
ANTLR IDE 2.1.2 for ANTLR 3.0 above  (0) 2011.11.02
antlrworks  (0) 2011.11.02
antlr / pccts package  (0) 2011.10.24
antlr - ANother Tool for Language Recognition  (0) 2011.04.23
Posted by 구차니
프로그램 사용/antlr2011. 10. 24. 22:35
우분투에서 antlr 실행 파일은 pccts 패키지에 존재한다.

$ antlr
'antlr' 프로그램은 현재 설치되어 있지 않습니다.  다음을 입력하여 이를 설치할 수 있습니다:
sudo apt-get install pccts 

$ antlr
Antlr parser generator   Version 1.33MR33   1989-2001
antlr [options] f1 f2 ... fn
    -CC            Generate C++ output (default=FALSE)
    -cr            Generate cross reference (default=FALSE)
    -ck      ___   Set compressed lookahead depth; fast approximate lookahead
    -e1            Ambiguities/errors shown in low detail (default)
    -e2            Ambiguities/errors shown in more detail
    -e3            Ambiguities for k>1 grammars shown with exact tuples (not lookahead sets)
    -f       ___   Read names of grammar files from specified file
    -fe      ___   Rename err.c
    -fh      ___   Rename stdpccts.h header (turns on -gh)
    -fl      ___   Rename lexical output--parser.dlg
    -fm      ___   Rename mode.h
    -fr      ___   Rename remap.h
    -ft      ___   Rename tokens.h
    -ga            Generate ANSI-compatible code (default=FALSE)
    -gc            Do not generate output parser code (default=FALSE)
    -gd            Generate code to trace rule invocation (default=FALSE)
    -ge            Generate an error class for each non-terminal (default=FALSE)
    -gh            Generate stdpccts.h for non-ANTLR-generated-files to include
    -gk            Generate parsers that delay lookahead fetches until needed
    -gl            Generate line info about grammar actions in C parser
    -glms          Like -gl but replace '\' with '/' in #line filenames for MS C/C++ systems
    -gp      ___   Prefix all generated rule functions with a string
    -gs            Do not generate sets for token expression lists (default=FALSE)
    -gt            Generate code for Abstract-Syntax-Trees (default=FALSE)
    -gx            Do not generate lexical (dlg-related) files (default=FALSE)
    -gxt           Do not generate tokens.h (default=FALSE)
    -k       ___   Set full LL(k) lookahead depth (default==1)
    -o       ___   Directory where all output files should go (default=".")
    -p             Print out the grammar w/o actions (default=no)
    -pa            Print out the grammar w/o actions & w/FIRST sets (default=no)
    -pr            no longer used; predicates employed if present
    -prc     ___   Turn on/off computation of context for hoisted predicates
    -rl      ___   Limit max # of tree nodes used by grammar analysis
    -stdout        Send grammar.c/grammar.cpp to stdout
    -tab     ___   Width of tabs (1 to 8) for grammar.c/grammar.cpp files
    -w1            Set the warning level to 1 (default)
    -w2            Ambiguities yield warnings even if predicates or (...)? block
    -mrhoist ___   Turn on/off k=1 Maintenance Release style hoisting
    -mrhoistk___   Turn on/off k>1 EXPERIMENTAL Maintenance Release style hoisting
    -aa      ___   Ambiguity aid for a rule (rule name or line number)
    -aam           Lookahead token may appear multiple times in -aa listing
    -aad     ___   Limits exp growth of -aa listing - default=1 (max=ck value)
    -info    ___   Extra info: p=pred t=tnodes f=first/follow m=monitor o=orphans 0=noop
    -treport ___   Report when tnode usage exceeds value during ambiguity resolution
    -newAST        In C++ mode use "newAST(...)" rather than "new AST(...)"
    -tmake         In C++ mode use parser's tmake method rather than "ASTBase::tmake(...)"
    -alpha         Provide additional information for "(alpha)? beta" error messages
    -mrblkerr      EXPERIMENTAL change to (...)* and (...)+ syntax error sets
    -nopurify      Don't use the notorious PURIFY macro (replaced by MR23 initial value syntax)
                   to zero return arguments of rules
    -              Read grammar from stdin 

[링크 : http://packages.ubuntu.com/oneiric/pccts]
[링크 : http://packages.ubuntu.com/hardy/antlr]

2011/04/23 - [Programming/언어론] - antlr - ANother Tool for Language Recognition

---
2011.11.06 추가
[링크 : http://www.antlr2.org/pccts133.html]
[링크 : http://www.antlr2.org/1.33/pccts_faq.html]
    [링크 : http://www.polhode.com/pccts.html]
    [링크 : http://www.antlr2.org/book/pcctsbk.pdf]
    [링크 : http://www.antlr2.org/1.33/tutorial.zip]

ubuntu에서 설치가능한 antlr은 PCCTS  버전으로
antlr 1.33MR33 이라고 표기되었듯이 아마도 antlr v1 으로 추정된다.
그런 이유로 이녀석으로 돌려봤자 요즘 문법은(antlr v2 / v3) 인식되지 않으며
기본적으로 생성될 경우 c언어로 출력이 나오게 된다.
$ cat poly.g
poly > [float r]
    :   <<float f;>>
        term>[$r] ( "\+" term>[f] <<$r += f;>> )*
    ;

$ antlr poly.g
Antlr parser generator   Version 1.33MR33   1989-2001
poly.g, line 3: warning: rule term not defined
poly.g, line 3: warning: rule term not defined
poly.g, line 3: warning: rule term not defined

$ cat poly.c 
/*
 * A n t l r  T r a n s l a t i o n  H e a d e r
 *
 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001
 * Purdue University Electrical Engineering
 * With AHPCRC, University of Minnesota
 * ANTLR Version 1.33MR33
 *
 *   antlr poly.g
 *
 */

#define ANTLR_VERSION	13333
#include "pcctscfg.h"
#include "pccts_stdio.h"
#define zzSET_SIZE 4
#include "antlr.h"
#include "tokens.h"
#include "dlgdef.h"
#include "mode.h"

/* MR23 In order to remove calls to PURIFY use the antlr -nopurify option */

#ifndef PCCTS_PURIFY
#define PCCTS_PURIFY(r,s) memset((char *) &(r),'\0',(s));
#endif

ANTLR_INFO

float
#ifdef __USE_PROTOS
poly(void)
#else
poly()
#endif
{
  float   _retv;
  zzRULE;
  zzBLOCK(zztasp1);
  PCCTS_PURIFY(_retv,sizeof(float  ))
  zzMake0;
  {
  float f;
  zzEXIT(zztasp1);
  return _retv;
fail:
  zzEXIT(zztasp1);
  zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
  zzresynch(setwd1, 0x1);
  return _retv;
  }
}

$  cat tokens.h
#ifndef tokens_h
#define tokens_h
/* tokens.h -- List of labelled tokens and stuff
 *
 * Generated from: poly.g
 *
 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001
 * Purdue University Electrical Engineering
 * ANTLR Version 1.33MR33
 */
#define zzEOF_TOKEN 1

#ifdef __USE_PROTOS
extern float poly(void);
#else
extern float poly();
#endif

#endif
extern SetWordType setwd1[];


$  cat err.c
/*
 * A n t l r  S e t s / E r r o r  F i l e  H e a d e r
 *
 * Generated from: poly.g
 *
 * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-2001
 * Parr Research Corporation
 * with Purdue University Electrical Engineering
 * With AHPCRC, University of Minnesota
 * ANTLR Version 1.33MR33
 */

#define ANTLR_VERSION	13333
#include "pcctscfg.h"
#include "pccts_stdio.h"
#define zzSET_SIZE 4
#include "antlr.h"
#include "tokens.h"
#include "dlgdef.h"
#include "err.h"

ANTLRChar *zztokens[3]={
	/* 00 */	"Invalid",
	/* 01 */	"@",
	/* 02 */	"\\+"
};
SetWordType setwd1[3] = {0x0,0x1,0x0};

$  cat parser.dlg
<<
/* parser.dlg -- DLG Description of scanner
 *
 * Generated from: poly.g
 *
 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001
 * Purdue University Electrical Engineering
 * With AHPCRC, University of Minnesota
 * ANTLR Version 1.33MR33
 */

#define ANTLR_VERSION	13333
#include "pcctscfg.h"
#include "pccts_stdio.h"
#include "antlr.h"
#include "tokens.h"
#include "dlgdef.h"
LOOKAHEAD

void
#ifdef __USE_PROTOS
zzerraction(void)
#else
zzerraction()
#endif
{
	(*zzerr)("invalid token");
	zzadvance();
	zzskip();
}
>>


%%START

@
	<<
		NLA = 1;
	>>

\+
	<<
		NLA = 2;
	>>

%%
[링크 : http://www.rubyholic.com/Languages/PCCTS/Grammars.html

'프로그램 사용 > antlr' 카테고리의 다른 글

java를 이용한 antlr AST 탐색하기(AST navigation)  (0) 2011.11.02
ANTLR IDE 2.1.2 for ANTLR 3.0 above  (0) 2011.11.02
antlrworks  (0) 2011.11.02
antlr + eclipse & java  (0) 2011.10.30
antlr - ANother Tool for Language Recognition  (0) 2011.04.23
Posted by 구차니
프로그램 사용/antlr2011. 4. 23. 13:59
ANTLR은 java로 작성된 LL 파서이다. (이름에 LR이 들어갔다고 해서 LR 파서는 아님)

[링크 : http://www.antlr.org/]
    [링크 : http://www.antlr.org/wiki/display/ANTLR3/ANTLR+v3+documentation]
    [링크 : http://www.antlr.org/wiki/display/ANTLR3/ANTLR+v3+printable+documentation]
[링크 : http://en.wikipedia.org/wiki/ANTLR]
    [링크 : http://en.wikipedia.org/wiki/LR_parser]
    [링크 : http://en.wikipedia.org/wiki/LL_parser]
[링크 : http://javadude.com/articles/antlrtut/]

'프로그램 사용 > antlr' 카테고리의 다른 글

java를 이용한 antlr AST 탐색하기(AST navigation)  (0) 2011.11.02
ANTLR IDE 2.1.2 for ANTLR 3.0 above  (0) 2011.11.02
antlrworks  (0) 2011.11.02
antlr + eclipse & java  (0) 2011.10.30
antlr / pccts package  (0) 2011.10.24
Posted by 구차니