ANTLR нет жизнеспособной альтернативы при вводе '/' - PullRequest
2 голосов
/ 29 июля 2011

Хорошо, я действительно запутался в этой ошибке.Я знаю, что в прошлом использование в качестве токена правила '/' не вызывало ошибок.Однако это просто сбивает с толку.Вот моя грамматика:

grammar LilWildC;

options {
    language = Java;
}

@header
{
    package com.matthewkimber.lilwildc;
}

@lexer::header
{
    package com.matthewkimber.lilwildc;
}

program
    :   global_variables procedure+
    ;

global_variables
    :   variable_definition*
    ;

variable_definition
    :   'number' IDENT ';'
    |   'number' '[' A_NUMBER ']' IDENT ';'
    ;

procedure
    :   'procedure' IDENT '{' block '}'
    ;

block
    :   local_variables statement+
    ;

local_variables
    :   variable_definition*
    ;

statement
    :   variable_reference '=' numeric_expression ';'
    ;

variable_reference
    :   IDENT
    |   IDENT '[' numeric_expression ']'
    ;

numeric_expression
    :   multiply_expression
        ( '+' multiply_expression
        | '-' multiply_expression
        )*
    ;

multiply_expression
    :   negative_factor
        ( '*' negative_factor
        | '/' negative_factor
        | '%' negative_factor
        )*
    ;

negative_factor
    :   '-'? factor
    ;

factor
    :   A_NUMBER
    |   variable_reference
    |   '(' numeric_expression ')'
    ;

A_NUMBER:   (('0'..'9')+'.'?) | (('0'..'9')*'.'('0'..'9')+) ;
IDENT:  ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9' | '_')* ;
WS: (' ' | '\t' | ('\r'?'\n'))+ { $channel = HIDDEN; } ;

Когда я запускаю тест по грамматике со следующим вводом:

procedure main
{
    var = 10 / 1;
}

, я получаю следующее дерево анализа в плагине ANTLR eclipse:

ANTLR Parse Tree - NoViableAltException

Чего я не понимаю, так это то, что умножение и по модулю работают нормально, только деление выдает эту ошибку.ANTLR пропускает прямо над '/' и не видит это как токен, или я что-то пропустил?Любая помощь с благодарностью.

1 Ответ

3 голосов
/ 29 июля 2011

В вашей грамматике нет ничего плохого, проблема должна быть в плагине Eclipse. Отладчик ANTLRWorks создает дерево:

enter image description here

И сам создаю небольшой тест (после исправления опечатки grammary LilWildC; до grammar LilWildC; и удаления пакетов) с основным классом и ANTLR 3.3:

LilWildC.g

grammar LilWildC;

options {
    language = Java;
}

program
    :   global_variables procedure+
    ;

global_variables
    :   variable_definition*
    ;

variable_definition
    :   'number' IDENT ';'
    |   'number' '[' A_NUMBER ']' IDENT ';'
    ;

p    rocedure
    :   'procedure' IDENT '{' block '}'
    ;

block
    :   local_variables statement+
    ;

local_variables
    :   variable_definition*
    ;

statement
    :   variable_reference '=' numeric_expression ';'
    ;

variable_reference
    :   IDENT
    |   IDENT '[' numeric_expression ']'
    ;

numeric_expression
    :   multiply_expression
        ( '+' multiply_expression
        | '-' multiply_expression
        )*
    ;

multiply_expression
    :   negative_factor
        ( '*' negative_factor
        | '/' negative_factor
        | '%' negative_factor
        )*
    ;

negative_factor
    :   '-'? factor
    ;

factor
    :   A_NUMBER
    |   variable_reference
    |   '(' numeric_expression ')'
    ;

A_NUMBER:   (('0'..'9')+'.'?) | (('0'..'9')*'.'('0'..'9')+) ;
IDENT:  ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9' | '_')* ;
WS: (' ' | '\t' | ('\r'?'\n'))+ { $channel = HIDDEN; } ;

Main.java

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    String src = 
        "procedure main     \n" +
        "{                  \n" +
        "    var = 10 / 1;  \n" +
        "}                  \n";
    LilWildCLexer lexer = new LilWildCLexer(new ANTLRStringStream(src));
    LilWildCParser parser = new LilWildCParser(new CommonTokenStream(lexer));
    parser.program();
  }
}
bart@hades:~/Programming/ANTLR/Demos/LilWildC$ java -cp antlr-3.3.jar org.antlr.Tool LilWildC.g
bart@hades:~/Programming/ANTLR/Demos/LilWildC$ javac -cp antlr-3.3.jar *.java
bart@hades:~/Programming/ANTLR/Demos/LilWildC$ java -cp .:antlr-3.3.jar Main

не выдает ошибок или предупреждений.

...