2017-05-09 2 views
0

Je sais qu'il existe des tutoriels pour un tel mais aucun d'entre eux ont été utiles jusqu'à présent, googled pour le passé comme 5 heures mais toujours pas de succès. J'essaie de construire une calculatrice arithmétique simple et j'ai trouvé un langage parfait pour le web, j'ai construit en utilisant le fichier jar pour générer des fichiers de projet pour C# mais je suis coincé là. Voici le GrammerANTLR4 Parser C# Projet arithmétique simple

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

et voici ses propriétés

testGrammer.g4 properties

Voici les fichiers de projet

File structure

Je sais qu'il devrait y avoir une classe de visiteur, mais suis sérieusement coincé. Je ne sais pas comment procéder à partir d'ici et pour être honnête, c'est la première fois que je travaille avec ANTLR ou avec d'autres parseurs de langue. Voici ce que j'ai jusqu'ici et comme vous pouvez le voir il me donne un tas d'erreurs.

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

Toute aide s'il vous plaît, merci à l'avance.

+0

Quelles erreurs obtenez-vous? Un soulignement rouge n'est pas suffisant pour un message d'erreur;) – Sylence

+0

Ok, j'ai copié l'exemple de cette [page] (https://github.com/antlr/antlr4/blob/master/doc/csharp-target.md) et le Les classes lexer et parser sont vides, même si je crée un constructeur qui accepte ce seul argument (dans les deux classes lexer et parser) je ne saurais toujours pas comment traiter la variable analysée, en plus il me manque une classe visiteur et une classe classes de base de visiteurs @Sylence – lulliezy

+1

Avez-vous ouvert les fichiers .cs générés (lexer et l'analyseur)? Sont-ils vides? Si elles sont générées sans problèmes, elles doivent avoir ces constructeurs. Avez-vous installé le paquetage Antlr Nuget dans votre projet? De plus, la méthode 'parser.StartRule()' n'existe pas dans votre projet, car vous n'avez pas de règle 'StartRule' dans votre grammaire, je pense que vous devriez utiliser' parser.compileUnit(); 'dans votre cas. –

Répondre

0

Vous n'avez pas besoin d'utiliser CharStream. Utilisez ceci:

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

Si vous souhaitez implémenter un Listener utiliser ceci:

YourListener expressionWalker = new YourListener(); 

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

Vous devez créer YourListener:

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

merci, j'ai utilisé ce' ITokenSource lexer = new testGrammerLexer (nouveau AntlrInputStream (entrée)); 'si passer aux auditeurs maintenant – lulliezy

+0

S'il vous plaît, marquez la réponse comme correcte et votez pour cela, merci !! –

+0

effectivement là-bas, il était vraiment utile, merci, mais en utilisant le visiteur à la place – lulliezy