> Java > java지도 시간 > ANTLR로 산술 표현식을 구문 분석하는 방법: 단계별 가이드?

ANTLR로 산술 표현식을 구문 분석하는 방법: 단계별 가이드?

Mary-Kate Olsen
풀어 주다: 2024-11-28 22:41:13
원래의
596명이 탐색했습니다.

How to Parse Arithmetic Expressions with ANTLR: A Step-by-Step Guide?

ANTLR: 연습 예제

ANTLR 웹사이트에서는 예제 문법을 제공하지만 문법을 Java 코드로 변환하는 과정을 이해하는 것은 피하는. 보다 명확한 이해를 위해 간단한 예를 들어 보겠습니다.

문법 정의

네 가지 기본 산술 연산자( , -, *, /) 및 괄호. Exp.g.

Exp.g

grammar Exp;

eval returns [double value]
    :    exp=additionExp {$value = $exp.value;}
    ;

additionExp returns [double value]
    :    m1=multiplyExp       {$value =  $m1.value;} 
         ( '+' m2=multiplyExp {$value += $m2.value;} 
         | '-' m2=multiplyExp {$value -= $m2.value;}
         )* 
    ;

multiplyExp returns [double value]
    :    a1=atomExp       {$value =  $a1.value;}
         ( '*' a2=atomExp {$value *= $a2.value;} 
         | '/' a2=atomExp {$value /= $a2.value;}
         )* 
    ;

atomExp returns [double value]
    :    n=Number                {$value = Double.parseDouble($n.text);}
    |    '(' exp=additionExp ')' {$value = $exp.value;}
    ;

Number
    :    ('0'..'9')+ ('.' ('0'..'9')+)?
    ;
로그인 후 복사

파서 및 Lexer 생성이라는 파일에 문법을 정의합니다.

ANTLR jar 파일을 사용하여 다음을 실행합니다. Exp.g이 포함된 디렉토리에서 다음 명령:

java -cp antlr-3.2.jar org.antlr.Tool Exp.g
로그인 후 복사

이렇게 하면 ExpLexer.java, ExpParser.java가 생성되고 Exp.tokens.

테스트 클래스 작성

ANTLRDemo.java를 생성하여 테스트 문법:

ANTLRDemo.java

import org.antlr.runtime.*;

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

예제 실행

먼저 파서 및 렉서 클래스를 다시 컴파일합니다. 그런 다음 실행 ANTLRDemo:

// Recompile
javac -cp .:antlr-3.2.jar ANTLRDemo.java

// Run
java -cp .:antlr-3.2.jar ANTLRDemo
로그인 후 복사

이제 콘솔은 표현식의 결과인 -12를 출력해야 합니다.

위 내용은 ANTLR로 산술 표현식을 구문 분석하는 방법: 단계별 가이드?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿