2017-05-09 10 views
0

私はそこにチュートリアルがあることを知っていますが、今までは役に立たず、過去5時間のような過去にはグーグルではありましたが、まだ成功していませんでした。単純な算術計算機を構築しようとしていて、オンラインで完璧な言語を見つけたので、jarファイルを使ってC#のプロジェクトファイルを生成しましたが、そこにはまっています。ここ は次のように私はいくつかのビジタークラスが存在すべきである知っているプロジェクトファイルがANTLR4 Parser C#Projectシンプルな算術

File structure

されている文法

grammar testGrammer; 

/* 
* Parser Rules 
*/ 

compileUnit 
    : expression + EOF 
    ; 

expression 
    : multiplyingExpression ((PLUS | MINUS) multiplyingExpression)* 
    ; 

multiplyingExpression 
    : powExpression ((TIMES | DIV) powExpression)* 
    ; 

powExpression 
    : atom (POW atom)* 
    ; 

atom 
    : scientific 
    | variable 
    | LPAREN expression RPAREN 
    | func 
    ; 

scientific 
    : number (E number)? 
    ; 

func 
    : funcname LPAREN expression RPAREN 
    ; 

funcname 
    : COS 
    | TAN 
    | SIN 
    | ACOS 
    | ATAN 
    | ASIN 
    | LOG 
    | LN 
    ; 

number 
    : MINUS? DIGIT + (POINT DIGIT +)? 
    ; 

variable 
    : MINUS? LETTER (LETTER | DIGIT)* 
    ; 

COS 
    : 'cos' 
    ; 

SIN 
    : 'sin' 
    ; 

TAN 
    : 'tan' 
    ; 

ACOS 
    : 'acos' 
    ; 

ASIN 
    : 'asin' 
    ; 

ATAN 
    : 'atan' 
    ; 

LN 
    : 'ln' 
    ; 

LOG 
    : 'log' 
    ; 

LPAREN 
    : '(' 
    ; 

RPAREN 
    : ')' 
    ; 

PLUS 
    : '+' 
    ; 

MINUS 
    : '-' 
    ; 

TIMES 
    : '*' 
    ; 

DIV 
    : '/' 
    ; 

POINT 
    : '.' 
    ; 

E 
    : 'e' | 'E' 
    ; 

POW 
    : '^' 
    ; 

LETTER 
    : ('a' .. 'z') | ('A' .. 'Z') 
    ; 

DIGIT 
    : ('0' .. '9') 
    ; 

/* 
* Lexer Rules 
*/ 

WS 
    :[ \r\n\t] + -> channel(HIDDEN) 
    ; 

であり、ここでそのプロパティ

testGrammer.g4 properties

ですが、真剣に立ち往生しています。私はここから進めていく方法を知らず、ANTLRや他の言語パーサーと一緒に作業しているのは正直なところです。 これまで私がこれまで持っていたことは、あなたが見てわかるように、それは私にエラーの束を与えています。

class code

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 
using Antlr4.Runtime; 
using Antlr4.Runtime.Tree; 


namespace ExpressionParser 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      String input = "3625"; 
      ICharStream stream = CharStreams.fromString(input); 
      ITokenSource lexer = new testGrammerLexer(stream); 
      ITokenStream tokens = new CommonTokenStream(lexer); 
      testGrammerParser parser = new testGrammerParser(tokens); 
      parser.buildParseTrees = true; 
      IParseTree tree = parser.StartRule(); 
     } 
    } 
} 

すべてのヘルプしてください、事前に感謝します。

+0

あなたはどのようなエラーが発生しますか:あなたはYourListenerを作成する必要が

YourListener expressionWalker = new YourListener(); ParseTreeWalker walker = new ParseTreeWalker(); //get the walker walker.Walk(tablesWalker, tree); 

これを使用しますか? ) – Sylence

+0

さて、この[page](https://github.com/antlr/antlr4/blob/master/doc/csharp-target.md)の例をコピーして、 lexerクラスとparserクラスの両方で、その1つの引数を取るコンストラクタを作成しても、私はまだ解析された変数を処理する方法がわかりません。さらに、ビジタークラスとビジターベースのクラス@Sylence – lulliezy

+1

生成された.csファイル(レクサーとパーサ)を開いたことはありますか?彼らは空ですか?問題なく生成された場合は、それらのコンストラクタが必要です。あなたのプロジェクトにAntlr Nugetパッケージをインストールしましたか?また、 'parser.StartRule()'メソッドはあなたのプロジェクトには存在しません。あなたの文法に 'StartRule'ルールがないので、あなたの場合は' parser.compileUnit(); 'を使うべきです。 –

答えて

0

CharStreamを使用する必要はありません。あなたがリスナーを実装する場合は、この使用

AntlrInputStream input = new AntlrInputStream("3625"); 
      ITokenSource lexer = new testGrammerLexer(input); 
      ITokenStream tokens = new CommonTokenStream(lexer); 
      testGrammerParser parser = new testGrammerParser (tokens); 
      IParseTree tree = parser.compileUnit(); 

public class TablesWalker : testGrammerBaseListener 
    { 
    //override methods to evaluate expression 
} 
+0

ありがとう、私はこの 'ITokenSource lexer = new testGrammerLexer(new AntlrInputStream(input));'を使いましたので、今聞いている人に移動します – lulliezy

+0

回答を正しいとマークし、投票してください。ありがとうございます! –

+0

本当に助かりました。ありがとうございました。代わりにビジターを使用しています – lulliezy