我正在嘗試使用ANTLR將LALR語法轉換爲LL,並且遇到了一些問題。到目前爲止,我認爲將表達式轉換爲自上而下的方法對我來說是直接的。問題是當我將Range(1..10)和(1.0..10.0)包含在浮點數中時。在範圍和語法錯誤中使用浮點數?
我試圖使用在這裏找到的答案,它甚至不能正確運行我的代碼,更不用說解決浮點範圍,即(float..float)。 Float literal and range parameter in ANTLR
附加是我的語法的一個樣本,只關注這個問題。
grammar Test;
options {
language = Java;
output = AST;
}
parse: 'in' rangeExpression ';'
;
rangeExpression : expression ('..' expression)?
;
expression : addingExpression (('=='|'!='|'<='|'<'|'>='|'>') addingExpression)*
;
addingExpression : multiplyingExpression (('+'|'-') multiplyingExpression)*
;
multiplyingExpression : unaryExpression
(('*'|'/'|'div') unaryExpression)*
;
unaryExpression: ('+'|'-')* primitiveElement;
primitiveElement : literalExpression
| id ('.' id)?
| '(' expression ')'
;
literalExpression : NUMBER
| BOOLEAN_LITERAL
| 'infinity'
;
id : IDENTIFIER
;
// L E X I C A L R U L E S
Range
: '..'
;
NUMBER
: (DIGITS Range) => DIGITS {$type=DIGITS;}
| (FloatLiteral) => FloatLiteral {$type=FloatLiteral;}
| DIGITS {$type=DIGITS;}
;
// fragments
fragment FloatLiteral : Float;
fragment Float
: DIGITS (options {greedy = true; } : '.' DIGIT* EXPONENT?)
| '.' DIGITS EXPONENT?
| DIGITS EXPONENT
;
BOOLEAN_LITERAL : 'false'
| 'true'
;
IDENTIFIER : LETTER (LETTER | DIGIT)*;
WS : (' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
fragment LETTER : ('a'..'z' | 'A'..'Z' | '_') ;
fragment DIGITS: DIGIT+;
fragment DIGIT : '0'..'9';
fragment EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
任何理由爲什麼它不即使考慮:
in 10;
或
in 10.0;
提前感謝!
感謝您的快速解決!但是我相信如果我沒有弄錯,這沒有解決(在10..10;),即數字範圍 – 2013-02-21 18:09:20
@AndyM,啊,是的,你說得對。檢查我的編輯版本。 – 2013-02-21 18:19:19
我不確定爲什麼我一旦放入EXPONENT就會得到這個:required(...)+ loop與字符'e'中的任何內容都不匹配......感謝您的幫助! – 2013-02-21 18:37:40