2016-03-13 3 views
0

Я пишу программу в java cc, где создаю компилятор. Я написал код в файле .jj, где я определил токены и синтаксический анализатор, но в конце файла программа сообщает об ошибке, не знаю почему. Пожалуйста, помогите мне исправить это.Java Cc tokens и парсер

void Start() : {} 
{ 
    (
     INTEGER_CONSTANT 
    | STRING_CONSTANT 
    | LOGIC_CONSTANT 
    | NOT 
    | IF 
    | END 
    | SUB 
    | LET 
    | CALL 
    | THEN 
    | CASE 
    | ELSE 
    | INPUT 
    | PRINT 
    | SELECT 
    | STATIC 
    | IDENTIFIER 
)* 
    <EOF> 
} 

У меня есть следующее сообщение об ошибке:

org.javacc.parser.ParseException: Encountered " "INTEGER_CONSTANT " "|" "| " "STRING_CONSTANT " "|" "| " "LOGIC_CONSTANT " "|" "| " "NOT " "|" "| " "IF " "|" "| " "END " "|" "| " "SUB " "|" "| " "LET " "|" "| " "CALL " "|" "| " "THEN " "|" "| " "CASE " "|" "| " "ELSE " "|" "| " "INPUT " "|" "| " "PRINT " "|" "| " "SELECT " "|" "| " "STATIC " "|" "| " "IDENTIFIER " ")" ") " "" " "" at line 91, column 7.

+0

Я думаю, что вы просто забыли поставить угловые скобки вокруг имен типов маркеров. Например, это должно быть '' вместо 'INTEGER_CONSTANT'. –

ответ

-1

Может быть, это потому, что вы использовали (...)* и, может быть, это потому, что с (...)+* вы говорите 0 или много раз. Я думаю, именно поэтому ошибка.

1

Предполагая, что у вас есть допустимые объявления для всех токенов (в лексической спецификации), используемых в методе парсера, вам необходимо использовать эти маркеры внутри угловых скобок. Ниже

void Start() : {} 
{ 
    (
     <INTEGER_CONSTANT> 
    | <STRING_CONSTANT> 
    | <LOGIC_CONSTANT> 
    | <NOT> 
    | <IF> 
    | <END> 
    | <SUB> 
    | <LET> 
    | <CALL> 
    | <THEN> 
    | <CASE> 
    | <ELSE> 
    | <INPUT> 
    | <PRINT> 
    | <SELECT> 
    | <STATIC> 
    | <IDENTIFIER> 
)* 
    <EOF> 
} 

JavaCC parser rule declaration:

1.) Direct Строка:

В этом случае вы можете использовать строку непосредственно внутри метода определения синтаксического анализа, но это необходимо, чтобы быть заключены в double_quotes.

void start() : {} 
    { "a" } 

2.) Используя маркер, определенный в разделе лексической спецификации:

здесь, чтобы определить правило с помощью лексических маркеров, которые должны быть включены в угловые скобки.

TOKEN:{ 
     < A : "a" > 
    } 
    void start() : {} 
     { <A>} 

3.) Использование в линии маркера Defintion:

Здесь мы можем объявить маркер внутри определения правил синтаксического анализа. Это законно, но сделать грамматику менее удобочитаемой.

void start() : {} 
    { <A : "a" >} 

4.) Позвонив еще одно правило синтаксического анализатора:

мы также можем определить правило, вызвав еще одно правило, как показано ниже.

void start() : {} 
    { A() } 
void A() : {} 
{ "a" } 

Надеется, что это будет полезно ...