2013-06-05 4 views
0

Я пытаюсь написать синтаксический анализатор для простого языка, и я дошел до того, что не знаю, как справиться с этой проблемой. Вот мой.jj файлЯрлык JavaCC не сопоставляется

options 
{ 
    STATIC = false; 
    LOOKAHEAD=2; 
    //DEBUG_LOOKAHEAD = true; 
    DEBUG_TOKEN_MANAGER=true; 
    FORCE_LA_CHECK = true; 
    DEBUG_PARSER = true; 
    JDK_VERSION = "1.7"; 
} 

PARSER_BEGIN(Parser) 
import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 

public class Parser{ 
    private static BufferedWriter bufferFileWriter; 
    private static FileWriter fWriter; 

    public static void main(String args []) throws ParseException, IOException 
    { 
     Parser parser = new Parser(System.in); 
     fWriter = new FileWriter("result", true); 
     bufferFileWriter = new BufferedWriter(fWriter); 
     parser.program(); 

     // TO DO 
    } 

} 

PARSER_END(Parser) 

SKIP : 
{ 
    " " 
| "\r" 
| "\t" 
| "\n" 
} 

TOKEN : /* OPERATORS */ 
{ 
    < PLUS : "+" > 
| < MINUS : "-" > 
| < MULTIPLY : "*" > 
| < DIVIDE : "/" > 
| < MODULO : "%" > 
| < ASSIG : ":=" > 
| < EQUAL : "==" > 
| < DIFF : "!=" > 
| < SMALLER : "<" > 
| < GRATER : ">" > 
| < S_OR_EQU: "<=" > 
| < G_OR_EQU: "=>" 
> 
} 

TOKEN : /*KEY WORDS FROM LANGUAGE */ 
{ 
    < VAR: "VAR"> 
| < BEGIN : "BEGIN" > 
| < END : "END" > 
| < IF : "IF" > 
| < ELSE : "ELSE" > 
| < THEN : "THEN" > 
| < WHILE: "WHILE" > 
| < DO : "DO" > 
| < READ : "READ" > 
| < WRITE : "WRITE" > 
| < SEMICOL : ";" > 
} 

TOKEN : 
{ 
    < VALUE : <ID> | <NUMBER> > 
| < NUMBER : (<DIGIT>)+ > 
| < #DIGIT : [ "0"-"9" ] > 
| < ID : (["a"-"z"])+ > 
} 

void program(): 
{} 
{ 
    varDeclarations()<BEGIN> commands() <END> 

} 


void varDeclarations(): 
{ 
} 
{ 
    <VAR> 
    { 
    System.out.println("past VAR token"); 
    } 

    (<ID> 
)+ 
} 
void commands(): 
{} 
{ 

    (LOOKAHEAD(3) 
    command())+ 
} 

void command(): 
{ 
    Token t; 
} 
{ 
    assign() 
    |<IF>condition()<THEN>commands()<ELSE>commands()<END> 
    |<WHILE>condition()<DO>commands()<END> 
    |<READ> 
    t=<ID> 
    { 
     try 
     { 
     fWriter.append("LOAD "+t.image); 
     System.out.println("LOAD "+t.image); 
     } 
     catch(IOException e) 
     { 
     }; 
    } 
    <SEMICOL> 

    |<WRITE> 
     t = <VALUE><SEMICOL> 

} 
void assign(): 
{ 
    Token t; 
} 
{ 
    t=<ID> 
    { 
    } 
    <ASSIG>expression(t)<SEMICOL> 
} 
void condition(): 
{} 
{ 
    <VALUE> condOperator() <VALUE> 

} 
void condOperator(): 
{} 
{ 
    <EQUAL> | <DIFF> | <SMALLER> | <S_OR_EQU> | <GRATER> | <G_OR_EQU> 
} 
Token operator(): 
{ 
    Token tok; 
} 
{ 
    tok=<PLUS> 
    { 
     System.out.println(tok.image); 
     return tok; 
    } 
    |tok=<MINUS> 
    { 
     System.out.println(tok.image); 
     return tok; 
    } 
    |tok=<MULTIPLY> 
    { 
     System.out.println(tok.image); 
     return tok; 
    } 
    |tok=<DIVIDE> 
    { 
     System.out.println(tok.image); 
     return tok; 
    } 
    |tok=<MODULO> 
    { 
     System.out.println(tok.image); 
     return tok; 
    } 
} 
void expression(Token writeTo): 
{ 
    Symbol s; 
    Token t1, t2, t3; 
} 
{ 
    t1 = <VALUE> 
    t2 = operator() 
    t3 = <VALUE> 
    <SEMICOL> 
    { 
     if(t2.image.equals("+")) 
     { 
     try 
     { 
      fWriter.append("ADD "+t1.image+" "+t2.image); 
      System.out.println("ADD "+t1.image+" "+t2.image); 
     }catch(IOException e) 
     { 
     } 
     } 
    } 
} 

Запись на файл в данный момент не имеет значения.

И это текст, который я хочу, чтобы разобрать:

VAR 
a b 
BEGIN 
READ a ; 
READ b ; 
WHILE a != b DO 
IF a < b THEN (* a <-> b *) 
a := a + b ; 
b := a - b ; 
a := a - b ; 
ELSE 
END 
a := a - b ; 
END 
WRITE a ; 
END 

и это выход, я получаю от отладчика:

mother-ship $ java Parser test 
Call: program 
    Call: varDeclarations 

Как вы можете видеть, синтаксический анализатор входит метод varDeclaration но почему может» Он соответствует токену со словом VAR?
Буду благодарен за любую помощь.

@ Theodore Я сделал, как вы предлагаете, но это не сработало. Может быть, я компилирую и выполняю программу не так? Это копия моей консоли:

$javacc Parser.jj 
Java Compiler Compiler Version 5.0 (Parser Generator) 
(type "javacc" with no arguments for help) 
Reading from file Parser.jj . . . 
File "TokenMgrError.java" is being rebuilt. 
File "ParseException.java" is being rebuilt. 
File "Token.java" is being rebuilt. 
File "SimpleCharStream.java" is being rebuilt. 
Parser generated successfully. 
$ javac *.java 
$ java Parser VAR a 
Call: program 
    Call: varDeclarations 
+0

Используйте опцию DEBUG_TOKEN_MANAGER = истина и показать нам результат. Также, если вы можете опубликовать ссылку на свой полный jj-файл, это поможет. –

+0

Привет, я редактировал свой вопрос и вставлял свой .jj-файл. Спасибо за Ваш интерес. –

ответ

1

У меня не было проблем с получением вашего парсера признать «VAR» ключевое слово. Проблема в том, что «a» обозначается как токен «VALUE», в то время как парсер ожидает маркер «ID» после ключевого слова «VAR». (См. Ввод и вывод ниже.)

Правило для VALUE' has precedence over the rule for ID` в силу первого. (См. Вопрос 3.3 в FAQ.)

Что вы, вероятно, должны сделать, это заменить правило, которое у вас есть сейчас для VALUE, со следующим правилом.

void Value() : {} { <ID> | <NUMBER> } 

Вход:

VAR 
a 

Выход:

Call: program 
    Call: varDeclarations 
Current character : V (86) at line 1 column 1 
    Possible string literal matches : { "VAR" } 
Current character : A (65) at line 1 column 2 
    Possible string literal matches : { "VAR" } 
Current character : R (82) at line 1 column 3 
    No more string literal token matches are possible. 
    Currently matched the first 3 characters as a "VAR" token. 
****** FOUND A "VAR" MATCH (VAR) ****** 

    Consumed token: <"VAR" at line 1 column 1> 
past VAR token 
Skipping character : \n (10) 
Current character : a (97) at line 2 column 1 
    No string literal matches possible. 
    Starting NFA to match one of : { <VALUE> } 
Current character : a (97) at line 2 column 1 
    Currently matched the first 1 characters as a <VALUE> token. 
    Possible kinds of longer matches : { <VALUE>, <ID> } 
Current character : \n (10) at line 2 column 2 
    Currently matched the first 1 characters as a <VALUE> token. 
    Putting back 1 characters into the input stream. 
****** FOUND A <VALUE> MATCH (a) ****** 

    Return: varDeclarations 
Return: program 
Exception in thread "main" tokenNotMatched.ParseException: Encountered " <VALUE> "a "" at line  2, column 1. 
Was expecting: 
    <ID> ... 
+0

Извините, что не комментировал ваш ответ, но редактирование мини-Markdown меня убило. Я нашел редактирование моего вопроса намного проще, и результат тоже легче читать. –

+0

Нет проблем. Мне кажется, что вы вводите ввод ('VAR a') в командной строке. Попробуйте запустить его с помощью java Parser

+0

Мне кажется, что даже двойного лицевого лапа недостаточно. Ты был прав. Раньше я запускал его в $ java Parser testFile, в то время как я должен это делать $ java Parser

Смежные вопросы