2017-05-09 5 views
0

저는 튜토리얼이 있지만 그 중 아무도 지금까지 도움이되지 못했지만 지난 5 시간 동안은 봤지만 여전히 성공하지 못했습니다. 간단한 arithmetics 계산기를 만들려고 노력하면서 온라인을위한 완벽한 언어를 찾았습니다. jar 파일을 사용하여 C# 용 프로젝트 파일을 생성했지만 거기에 붙어 있습니다. 다음은 여기에 문법ANTLR4 파서 C# 프로젝트 단순한 Arthmetics

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

하고하는 것은 다음은 프로젝트 파일

File structure 좀 방문자 클래스가 있어야 알고

그러나 그것의 속성

testGrammer.g4 properties

입니다 심각하게 붙어있다. 여기서부터 어떻게 진행해야할지 모르겠다. 솔직히 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

무슨 오류를받을 수 있나요 당신이 리스너는이를 사용하여 구현하려면

AntlrInputStream input = new AntlrInputStream("3625"); ITokenSource lexer = new testGrammerLexer(input); ITokenStream tokens = new CommonTokenStream(lexer); testGrammerParser parser = new testGrammerParser (tokens); IParseTree tree = parser.compileUnit(); 

이 사용? 빨간색 밑줄로는 오류 메시지가 충분하지 않습니다.) – Sylence

+0

그래,이 [page] (https://github.com/antlr/antlr4/blob/master/doc/csharp-target.md)의 예제를 lexer와 parser 클래스는 비어 있습니다. 비록 하나의 인수 (lexer와 parser 클래스 모두에서)를 취하는 생성자를 만들었지 만, 파싱 된 변수를 처리하는 방법을 알지 못하고, 방문자 클래스가 누락되었습니다. visitorbase classes @Sylence – lulliezy

+1

생성 된 .cs 파일 (렉서 및 파서)을 열었습니까? 그들은 비어 있습니까? 문제없이 생성 된 경우 생성자가 있어야합니다. 프로젝트에 Antlr Nuget 패키지를 설치 했습니까? 또한'parser.StartRule()'메소드는 프로젝트에 존재하지 않습니다. 문법에'StartRule' 규칙이 없기 때문에'parser.compileUnit();'을 사용해야 할 것입니다. –

답변

0

CharStream을 사용해야하지 않습니다.

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 lexer = new testGrammerLexer (new AntlrInputStream (input));'을 사용하여 지금 청취자로 이동했습니다 – lulliezy

+0

제발, 올바른 답변을 표시하고 그것을 위해 투표, 감사합니다! –

+0

실제로는 도움이되었지만 대신 방문자를 사용했습니다. – lulliezy