ANTLR4 解析器 C# 项目 简单算术

ANTLR4 Parser C# Project Simple Arithmetics

我知道有这样的教程,但 none 到目前为止,其中的一些教程很有用,过去用谷歌搜索了大约 5 个小时,但仍然没有成功。我正在尝试构建一个简单的算术计算器,并且我找到了一种完美的在线语言,我已经使用 jar 文件为 c# 生成项目文件,但我被困在那里。 这是语法

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

这是它的属性

以下是工程文件

我知道应该有一些访客 class 但我真的卡住了。我不知道如何从这里开始,老实说,这是我第一次使用 ANTLR 或任何其他语言解析器。 这是我到目前为止所知道的,正如你所看到的,它给了我一堆错误。

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

任何帮助,在此先感谢。

您不必使用 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();

如果你想实现一个监听器,使用这个:

YourListener expressionWalker = new YourListener();

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

您必须创建 YourListener:

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