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
Im Folgenden werden die Projektdateien
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.
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.
Welche Fehler haben Sie bekommen? Eine rote Unterstreichung reicht für eine Fehlermeldung nicht aus;) – Sylence
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
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. –