2017-05-09 51 views
0

我知道有這樣的教程,但它們都沒有幫助,迄今爲止,搜索過去像5小時,但仍然沒有成功。我試圖建立一個簡單的算術計算器,我發現了一個完美的在線語言,我已經使用jar文件爲c#生成項目文件,但是我一直在那裏。 這裏是語法ANTLR4解析器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(); 
     } 
    } 
} 

任何幫助請在此先感謝。

+0

你什麼錯誤使用此?紅色下劃線不足以顯示錯誤信息;) – Sylence

+0

好的,我從這個[page](https://github.com/antlr/antlr4/blob/master/doc/csharp-target.md)複製了示例,詞法分析器和解析器類是空的,即使我創建了一個構造函數來接受一個參數(在詞法分析器和解析器類中),我仍然不知道如何處理解析的變量,再加上我缺少訪問者類和訪問者類@Sylence – lulliezy

+1

您是否打開生成的.cs文件(詞法分析器和解析器)?它們是空的嗎?如果它們沒有問題產生,它們必須具有這些構造函數。你有沒有在你的項目中安裝Antlr Nuget軟件包?另外,'parser.StartRule()'方法不存在於你的項目中,因爲你的語法中沒有'StartRule'規則,我認爲你應該在你的情況下使用'parser.compileUnit();'。 –

回答

0

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

謝謝,我用這個'ITokenSource詞法分析器=新testGrammerLexer(新AntlrInputStream(輸入));'所以現在向聽衆 – lulliezy

+0

請標記答案正確並投票支持,謝謝! –

+0

實際上到那裏它真的很有幫助,謝謝,但使用訪客 – lulliezy