Исправление ссылки на электронную таблицу ($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
Другие вопросы по тегам