Исправление ссылки на электронную таблицу ($a$1, $a1, $ 1 и т. Д.) В грамматике ANTLR
Я работаю над редактированием функций для веб-таблицы, где мне нужно определить ссылки на ячейки, ссылки на диапазоны, а затем раскрасить их в соответствии с моим требованием. Я могу идентифицировать и раскрасить ссылки на ячейки, но не смог идентифицировать фиксированные ссылки на ячейки ($a$1, $a1, $ 1 и т. Д...), так как он выдает ошибку после ввода символа доллара ('$'). Может ли кто-нибудь помочь мне в этом.
Когда я пытаюсь ввести ссылку на ячейку как "$A$1", она не выдает жизнеспособного исключения после ввода второго символа доллара для ссылки на строку, и я не уверен, почему. Как прочитать символ "$", чтобы распознать фиксированную ссылку на ячейку?
К вашему сведению, я расширил найденную грамматику @ antlr3 - Генерация дерева разбора
Я использую грамматику для ссылки на ячейку / диапазон, как показано ниже
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);*/ } ;
1 ответ
Я не могу воспроизвести это.
Когда я копирую и вставляю вашу оригинальную грамматику (без предиката ( ... )=>
!) и изменить parse
Правило в это:
parse
: (t=. {console.log('type:', $t.type, 'text:', $t.text);})* EOF
//exp EOF -> exp
;
Затем я генерирую лексер / парсер:
java -cp antlr-3.3-complete.jar org.antlr.Tool Excel.g
и используйте тестовый HTML-файл:
<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>
а затем введите вход $a$1 $a$1:$a$9
в текстовом поле я вижу следующий вывод, выводимый на мою консоль Chrome:
тип: 28 текст: $a$1 тип: 29 текст: $a$1:$a$9
где файл Excel.tokens содержит:
CELLREFERENCE = 28 RANGEREFERENCE = 29