2016-11-29 8 views
2

Я пытаюсь написать очень простой парсер. Я использую JFlex с Java CUP. Вот мой код:CUP парсер возвращает синтаксическую ошибку для допустимого ввода

LEX файл:

import java_cup.runtime.*; 


%% 

%class Lexer 
%line 
%column 
%cup 


%{ 
    /*********************************************************************************/ 
    /* Create a new java_cup.runtime.Symbol with information about the current token */ 
    /*********************************************************************************/ 
    private Symbol symbol(int type)    {return new Symbol(type, yyline, yycolumn);} 
    private Symbol symbol(int type, Object value) {return new Symbol(type, yyline, yycolumn, value);} 

%} 



%% 


<YYINITIAL> { 
<<EOF>>    { return symbol(sym.EOF); } 
"|"     { return symbol(sym.PIPE); } 

} 

CUP файл:

import java_cup.runtime.*; 


terminal PIPE; 

non terminal myrule; 

myrule ::= PIPE {: RESULT = 42; :}; 

Main.java

import java.io.FileReader; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     CUP_FILECup parser = new CUP_FILECup(new Lexer(new FileReader(args[0]))); 
     parser.debug_parse(); 
    } 

} 

Как вы можете видеть, я пытался сделать это так просто, как я мог, я получаю следующую ошибку для входного файла, содержащего только один символ: «|».

Синтаксическая ошибка в характере 0 ввода

Но ясно, что мы определили правильный вывод для "|".

Почему это происходит?

EDIT:
- "начать с myrule;" не помогает

+0

Может ли быть спецификация во входном файле? https://msdn.microsoft.com/en-us/library/windows/desktop/dd374101(v=vs.85).aspx –

+0

Насколько я могу судить, нет. – Plex

+0

Я использовал 'file -' и получил' ASCII-текст' (я использую Ubuntu) – Plex

ответ

0

Можете ли вы попробовать FileInputStream вместо FileReader?

(Если это работает, вы можете взглянуть на https://stackoverflow.com/a/5155255/1415645)

И вы можете попробовать только лексер первым.