我正在编辑网络电子表格的功能,我需要识别单元格引用,范围引用,然后根据我的要求对它们进行着色。我能够识别和着色单元格引用,但无法识别固定单元格引用($ a $ 1,$ a1,$ 1等...),因为它在输入$('$')符号后抛出错误。任何人都可以帮助我。
当我尝试将单元格引用输入为“$ A $ 1”时,在为行引用输入第二个美元符号后它没有抛出可行的异常,我不知道为什么。如何读取“$”符号来识别固定的单元格引用?
仅供参考,我已经扩展了@ antlr3 - Generating a Parse Tree
找到的语法我正在使用语法进行单元格/范围引用,如下所示
CELLREFERENCE
: '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+
;
RANGEREFERENCE
: '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+ ':' '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+
;
This will work for identifying the colon,
RANGEREFERENCE : CELLREFERENCE ((':' CELLREFERENCE)=> ':' CELLREFERENCE)?;
Still not sure about the '$' issue in cell reference.
请在此处找到完整的语法:
grammar Excel;
options {
output=AST;
language=JavaScript;
}
tokens {
// define pseudo-operations
FUNC;
CALL;
NEGATE;
}
parse
: exp EOF -> exp
;
exp
: orExp
;
orExp
: andExp (OR^ andExp)*
;
andExp
: eqExp (AND^ eqExp)*
;
eqExp
: relExp (( EQUALS | NOTEQUALS)^ relExp)*
;
relExp
: addExp ( (LT^|LTEQ^|GT^|GTEQ^) addExp)*
;
addExp
: multExp ( (PLUS^| MINUS^) multExp)*
;
multExp
: unaryExp (( MULT^ | DIV^ | MOD^ |POW^| IS^) unaryExp)*
;
unaryExp
: NOT atom -> ^(NOT atom)
| MINUS atom -> ^(NEGATE atom)
| ASSIGN atom -> ^(ASSIGN atom)
| atom
;
atom
: TRUE
| FALSE
| INT
| FLOAT
| function
| CELLREFERENCE
| RANGEREFERENCE
| '(' exp ')' -> exp
;
POW : '^';
DIV : '/';
MOD : '%';
MULT : '*';
PLUS : '+';
MINUS : '-';
LT : '<';
LTEQ : '<=';
GT : '>';
GTEQ : '>=';
EQUALS : '==';
ASSIGN: '=';
NOTEQUALS : '<>';
INT : '0'..'9'+;
FLOAT : ('0'..'9')* '.' ('0'..'9')+;
OR : 'or' ;
AND : 'and' ;
IS : 'is' ;
NOT : 'not' ;
TRUE : 'true' ;
FALSE : 'false' ;
function
: IDENT '(' ( exp (',' exp)* )? ')' -> ^(FUNC IDENT (exp)*)
;
CELLREFERENCE
: '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+
;
RANGEREFERENCE
: '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+ ':' '$'?('a'..'z'|'A'..'Z')+'$'?('0'..'9')+
;
IDENT
: ('a'..'z' | 'A'..'Z') ('a'..'z' | 'A'..'Z' |'0'..'9')*
;
SPACE : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;
ERRCHAR : Err =. { /*console.log($Err);*/ } ;
答案 0 :(得分:1)
我无法重现它。
当我复制粘贴原始语法(没有谓词{{1}}!)时,将( ... )=>
规则更改为:
parse
然后我生成一个词法分析器/解析器:
java -cp antlr-3.3-complete.jar org.antlr.Tool Excel.g
并使用测试html文件:
parse
: (t=. {console.log('type:', $t.type, 'text:', $t.text);})* EOF
//exp EOF -> exp
;
然后在文本字段中输入输入<html>
<head>
<script type="text/javascript" src="antlr3-all-min.js"></script>
<script type="text/javascript" src="ExcelLexer.js"></script>
<script type="text/javascript" src="ExcelParser.js"></script>
<script type="text/javascript">
function init() {
var evalButton = document.getElementById("eval");
evalButton.onclick = evalExpression;
}
function evalExpression() {
document.getElementById("answer").innerHTML = "";
var Excelression = document.getElementById("src").value;
if(Excelression) {
var lexer = new ExcelLexer(new org.antlr.runtime.ANTLRStringStream(Excelression));
var tokens = new org.antlr.runtime.CommonTokenStream(lexer);
var parser = new ExcelParser(tokens);
parser.parse().getTree();
}
}
</script>
</head>
<body onload="init()">
<input id="src" type="text" size="35" />
<button id="eval">evaluate</button>
<div id="answer"></div>
</body>
</html>
,我看到以下输出打印到我的Chrome控制台:
type: 28 text: $a$1 type: 29 text: $a$1:$a$9
Excel.tokens文件包含:
CELLREFERENCE=28 RANGEREFERENCE=29