ANTLR4 Parser C#Project简单算术

时间:2017-05-09 11:03:27

标签: c# antlr antlr4

我知道有这样的教程,但到目前为止它们都没有帮助,谷歌搜索过去像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)
    ;

这是它的属性

testGrammer.g4 properties

以下是项目文件

File structure

我知道应该有一些访客班,但我严重陷入困境。我不知道如何从这里开始,说实话,这是我第一次使用ANTLR或任何其他语言解析器。 这是我到目前为止所看到的,因为你可以看到它给了我一堆错误。

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

请提前帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

你不必使用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
}