>Java >java지도 시간 >ANTLR을 사용하여 간단한 산술 표현식 파서를 어떻게 만들 수 있습니까?

ANTLR을 사용하여 간단한 산술 표현식 파서를 어떻게 만들 수 있습니까?

DDD
DDD원래의
2024-12-06 13:51:16821검색

How Can I Create a Simple Arithmetic Expression Parser Using ANTLR?

ANTLR: 간단한 예

ANTLR은 텍스트 데이터를 구문 분석하는 강력한 도구이지만 시작하기가 두려울 수 있습니다. ANTLR의 기본 사항을 파악하기 위해 간단한 예를 찾는 사람들을 위해 여기에 포괄적인 데모가 있습니다.

문법 만들기

먼저 다음과 같은 파일에 간단한 문법을 ​​정의해 보겠습니다. Exp.g:

grammar Exp;

eval
    :   additionExp EOF
    ;

additionExp
    :   multiplyExp
        ( '+' multiplyExp
        | '-' multiplyExp
        )*
    ;

multiplyExp
    :   atomExp
        ( '*' atomExp
        | '/' atomExp
        )*
    ;

atomExp
    :   Number
    |   '(' additionExp ')'
    ;

Number
    :   ('0'..'9')+ ('.' ('0'..'9')+)?
    ;

파서 생성 및 Lexer

문법이 생성되면 ANTLR jar를 다운로드하고 다음 명령을 실행하여 파서와 어휘 분석기를 생성합니다.

java -cp antlr-3.2.jar org.antlr.Tool Exp.g

이렇게 하면 ExpLexer.java, ExpParser가 생성됩니다. .java 및 Exp.tokens 파일.

테스트 생성 클래스

ANTLRDemo.java라는 테스트 클래스를 만들어 보겠습니다.

import org.antlr.runtime.*;

public class ANTLRDemo {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("12*(5-6)");
        ExpLexer lexer = new ExpLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        ExpParser parser = new ExpParser(tokens);
        System.out.println(parser.eval());
    }
}

파서 실행 이해

ANTLRDemo를 컴파일하고 실행합니다. 자바. 표현식이 올바르게 평가되면 출력이 인쇄되지 않습니다. 그렇지 않으면 오류 메시지가 표시됩니다.

문법에 Java 코드 추가

파서의 기능을 향상하려면 {.. .} 블록:

eval
    :   additionExp {
            /* plain code block! */
            System.out.println("value equals: " + $value);
        }
    ;

이 예는 다음의 결과를 인쇄합니다. 표현식.

규칙에서 Double 값 반환

더블을 반환한다는 것을 나타내기 위해 문법의 각 규칙에 [double value]를 반환하는 추가:

eval returns [double value]
    :   additionExp {
            /* plain code block! */
            System.out.println("value equals: " + $value);
        }
    ;

ANTLRDemo 수정 class

ANTLRDemo.java 클래스를 업데이트하여 반환된 값을 검색합니다.

import org.antlr.runtime.*;

public class ANTLRDemo {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("12*(5-6)");
        ExpLexer lexer = new ExpLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        ExpParser parser = new ExpParser(tokens);
        System.out.println(parser.eval());
    }
}

ANTLRDemo.java를 다시 실행하여 콘솔에 인쇄된 결과를 확인하세요.

위 내용은 ANTLR을 사용하여 간단한 산술 표현식 파서를 어떻게 만들 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.