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
Voici les fichiers de projet
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.
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.
Quelles erreurs obtenez-vous? Un soulignement rouge n'est pas suffisant pour un message d'erreur;) – Sylence
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
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. –