2017-05-09 4 views
0

Ich weiß, es gibt Tutorials für solche, aber keine von ihnen war bisher hilfreich, googelte für die Vergangenheit wie 5 Stunden, aber immer noch keinen Erfolg. Ich versuche einen einfachen Rechenrechner zu erstellen und ich habe eine perfekte Sprache für online gefunden, ich habe mit der JAR-Datei gebaut, um Projektdateien für C# zu generieren, bin aber dort steckengeblieben. Hier ist die grammerANTLR4 Parser C# Projekt Einfache Arithmetik

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) 
    ; 

und hier ist seine Eigenschaften

testGrammer.g4 properties

Im Folgenden werden die Projektdateien

File structure

ich es wissen sollten einige Besucher Klasse sein, aber bin ernsthaft stecken geblieben. Ich weiß nicht, wie ich von hier aus vorgehen soll und um ehrlich zu sein, es ist das erste Mal, dass ich mit ANTLR oder anderen Sprachparsern arbeite. Hier ist, was ich bisher habe und wie Sie sehen können, gibt es mir eine Reihe von Fehlern.

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(); 
     } 
    } 
} 

Jede Hilfe bitte, Dank im Voraus.

+0

Welche Fehler haben Sie bekommen? Eine rote Unterstreichung reicht für eine Fehlermeldung nicht aus;) – Sylence

+0

Okay ich habe das Beispiel von dieser [Seite] kopiert (https://github.com/antlr/antlr4/blob/master/doc/csharp-target.md) und die Lexer - und Parser - Klassen sind leer, selbst wenn ich einen Konstruktor erzeuge, der dieses Argument (in beiden Lexer - und Parser - Klassen) verwendet, weiß ich immer noch nicht, wie ich mit der analysierten Variablen umgehen soll Besucherklassen @Sylence – lulliezy

+1

Haben Sie die generierten .cs-Dateien geöffnet (den Lexer und den Parser)? Sind sie leer? Wenn sie ohne Probleme erzeugt werden, müssen sie diese Konstruktoren haben. Haben Sie das Antlr Nuget-Paket in Ihrem Projekt installiert? Auch die Methode 'parser.StartRule()' existiert in Ihrem Projekt nicht, da Sie in Ihrer Grammatik keine 'StartRule'-Regel haben. Ich denke, in Ihrem Fall sollten Sie 'parser.compileUnit();' verwenden. –

Antwort

0

Sie müssen CharStream nicht verwenden. Verwenden Sie diese Option:

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

Wenn Sie ein Listener diese implementieren möchten verwenden:

YourListener expressionWalker = new YourListener(); 

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

Sie haben YourListener zu erstellen:

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

Danke, ich habe diese 'ITokenSource lexer = new testGrammerLexer (neue AntlrInputStream (input));' so weiter zu Listenern jetzt – lulliezy

+0

Bitte, markieren Sie die Antwort als richtig und stimmen Sie dafür, Danke !! –

+0

eigentlich bis dort war es wirklich hilfreich, danke, aber Besucher statt – lulliezy