저는 ANTLR을 처음 사용하기 때문에 ANTLR4와 C#을 사용하여 계산기 응용 프로그램에 비교적 간단한 파서를 생성하려고합니다. 여기에 문법 파일이 있습니다. Antlr4 파서가 암시 적 승수 연산의 순서를 따르지 못합니다.
parser grammar CalculatorExpressionParser;
options{
language = CSharp2;
}
expr: FUNC expr? (COMMA expr)* RIGHTPAREN #CallFunction
| LEFTPAREN expr RIGHTPAREN #Parens
| expr POW<assoc=right> expr #Pow
| expr op=(MULTIPLY | DIVIDE)? expr #MultDivide
| expr op=(ADD | SUBTRACT) expr #AddSubtract
| SUBTRACT expr #Negative
| NUMBER #Number
;
나는 구문 분석하기 전에 수치 동등한 변수의 암시 적 곱셈과 변환을 지원하기 위해 토큰을 생성하는 사용자 정의 렉서를 썼다.
하지만 입력시 다음 결과가 표시됩니다. 내가 오류 복구 기능을 해제하고 모든 모호성 오류를보고 그것을 설정하고 내가 어떤을 받고있는 것으로 나타나지 않습니다 시도
2+6/3 => 4 (correct)
6/3+2 => 1.2 (should be 4)
6/(3+2) => 4 (also correct)
1+2*3 => 7 (correct)
2*3+1 => 8 (should be 7 too)
(2*3)+1 => 7 (correct)
참고.
어쨌든 내가 다음 문법을? 나누기/곱셈 연산자 다음에 암시 적 곱셈이 더 이상 지원되지 않는다는 점을 제외하고는 큰 효과가있는 것으로 보입니다.
parser grammar CalculatorExpressionParser;
options{
language = CSharp2;
}
expr: FUNC expr? (COMMA expr)* RIGHTPAREN #CallFunction
| LEFTPAREN expr RIGHTPAREN #Parens
| expr POW<assoc=right> expr #Pow
| expr op=(MULTIPLY | DIVIDE) expr #MultDivide
| expr op=(ADD | SUBTRACT) expr #AddSubtract
| SUBTRACT expr #Negative
| NUMBER #Number
;
궁금한 이유는 무엇입니까? 일치하는 순서를 어기 는가? 그리고 이것을 해결할 수있는 쉬운 방법이 있습니까?
최신 릴리스에서 수정되었을 수 있습니다. 내가 테스트 할 수 있도록 문제를 설명하는 자급 한 예제가 있습니까? –
dsffadfdasfadsfdf – hashtable
다음은 간단한 렉서/구문 분석기 문법 파일, 방문자 구현 및 문제를 보여주는 테스트 프로그램입니다. https://dl.dropboxusercontent.com/u/22576981/ANTLR4Test/Combined1.zip – hashtable