台灣最大程式設計社群網站
線上人數
1467
 
會員總數:245468
討論主題:189226
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> ANTLR 與 c#
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
ANTLR 與 c#
價值 : 0 QP  點閱數:1205 回應數:0

樓主

elleryq
初學者
205 1
156 39
發送站內信

捐贈 VP 給 elleryq
ANTLR是一個用來將剖析語法轉換成語言的工具,如果你接觸過 lex/yacc 的話,就可以很容易瞭解.

這裡有一篇相當簡單的Introduction.
Step by step, 就可以做出一個計算運算式的小程式.

可是,產生出來的程式語言卻是 java, 如果要改用 c# 呢??
依照官方的說明, ANTLR 可以產出三種語言: C++, Java, c#.
所以該怎麼產生呢??需不需要另外寫甚麼??
官方網站同樣也提供了這麼一篇:Notes for using the ANTLR C# Code Generator.

這裡我們以Introduction裡面所提供的範例來作為例子,將他命名為 "expr.g.txt":
引用:
class ExprParser extends Parser;

expr returns [int value=0]
{int x;}
: value=mexpr
( PLUS x=mexpr {value += x;}
| MINUS x=mexpr {value -= x;}
)*
;

mexpr returns [int value=0]
{int x;}
: value=atom ( STAR x=atom {value *= x;} )*
;

atom returns [int value=0]
: i:INT {value=Integer.parseInt(i.getText());}
| LPAREN value=expr RPAREN
;

class ExprLexer extends Lexer;

options {
k=2; // needed for newline junk
charVocabulary='\u0000'..'\u007F'; // allow ascii
}

LPAREN: '(' ;
RPAREN: ')' ;
PLUS : '+' ;
MINUS : '-' ;
STAR : '*' ;
INT : ('0'..'9')+ ;
WS : ( ' '
| '\r' '\n'
| '\n'
| '\t'
)
{$setType(Token.SKIP);}
;


第一步你需要做的,就是在這份例子的最上頭加上
引用:
options {
language = "CSharp";
namespace = "SmallCalc"; // encapsulate code in this namespace
//classHeaderPrefix = "protected"; // use to specify access level for generated class
}

表明我們要使用 c#, 並且 namespace 要命名為 SmallCalc.

接著使用下載到的 antlr, 來進行轉換
>antlr expr.g.txt

他會產出下列檔案:

  • ExprLexer.cs

  • ExprParser.cs

  • ExprParserTokenTypes.cs

  • ExprParserTokenTypes.txt



ok, 該有的都有啦,我們接下來需要的是主程式與必要的 antlr assembly(組件).

要取得 antlr assembly, 你必須先取得 antlr 的原始碼 (找 source distribution).
解開原始碼以後,在 lib/csharp/ 下,會有個 visual studio project 檔與 NAnt build 檔.
看你熟悉哪一個,就用哪一個.
總之你會得到 antlr.runtime.dll, 將他複製到剛剛程式所在的位置.

主程式的話,很簡單,就是使用剛剛產生出來的程式來進行剖析:
引用:
using System;
using System.IO;
using antlr;

namespace SmallCalc
{
public class Smallcalc {
public static void Main(String[] args)
{
ExprLexer lexer = new ExprLexer( Console.OpenStandardInput() );
ExprParser parser = new ExprParser(lexer);
int x = parser.expr();
Console.WriteLine(x);
}
}
}


然後編譯
>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\csc /target:exe /out:smallcalc.exe /r:system.dll /r:antlr.runtime.dll *.cs

你會發現有點小錯誤:
引用:
ExprParser.cs(156,11): error CS0246: 找不到型別或命名空間名稱 'Integer' (您是否遺漏 using 指示詞或組件參考?)

稍微調整一下,從原來的
引用:
value=Integer.parseInt(i.getText());

修正為
引用:
value=Convert.ToInt32( i.getText() );


再重新編譯一次,就大功告成了.

試試看結果囉...
引用:
>smallcalc
1+3+5+7*100

709


:)

參考資料:
*ANTLR Parser Generator
*An Introduction To ANTLR,這是以簡單的運算式為例.
*Notes for using the ANTLR C# Code Generator,如何產生 c# code, 並且編譯.以及一些選項說明.

搜尋相關Tags的文章: [ antlr ] , [ c# ] ,
本篇文章發表於2006-02-25 19:14
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.