2014-10-16 3 views
0

Java에서 간단한 파서를 작성하는 데 문제가 있습니다. ('STRING : ...'예 'PUT', 또는)이 파서에 의해 문자 문자열을 구문 분석하고 이상이 파서 토큰 프로세스보다 ArrayList의에 토큰을 저장파서 코드가 제대로 작동하지 않습니다.

을 내 코드의 그 :

package net.ruza; 

import java.util.*; 

public class SimpleParser 
{ 
    public static void main(String[] args) 
    { 
     SimpleParser simpleParser = new SimpleParser(); 

     Scanner sc = new Scanner(System.in); 

     String input = "###"; 

     List<String> data = new ArrayList<String>(); 

     while (input.length() > 1) 
     { 
      input = sc.nextLine(); 

      data.addAll(simpleParser.lex(input)); 
     } 

     for (String s : data) 
     { 
      System.out.println(s); 
     } 

     simpleParser.parse(data); 
    } 

    public List<String> lex(String parse) 
    { 
     List<String> tokens = new ArrayList<String>(); 

     boolean stringFound = false; 
     StringBuilder string = new StringBuilder(); 

     StringBuilder tok = new StringBuilder(); 

     for (char c : parse.toCharArray()) 
     { 
      tok.append(c); 

      if (tok.toString().equals("put")) 
      { 
       tokens.add("PUT"); 

       tok = new StringBuilder(); 
      } 
      else if (tok.toString().equals(" ") && !stringFound) 
      { 
       tok = new StringBuilder(); 
      } 
      else if (!stringFound && (tok.toString().equals("\"") || tok.toString().equals("'"))) 
      { 
       stringFound = true; 

       tok = new StringBuilder(); 

       System.out.println("String found!"); 
      } 
      else if (stringFound && (tok.toString().equals("\"") || tok.toString().equals("'"))) 
      { 
       tokens.add("STRING:'" + string.toString() + "'"); 

       System.out.println("String end!"); 

       tok = new StringBuilder(); 
       string = new StringBuilder(); 

       stringFound = false; 
      } 
      else if (stringFound) 
      { 
       string.append(c); 

       tok = new StringBuilder(); 
      } 
     } 

     return tokens; 
    } 

    public void parse(List<String> tokens) 
    { 
     System.out.println("Parser invoked!"); 

     boolean putNext = false; 

     for (String s : tokens) 
     { 
      if (s.equals("PUT")) 
      { 
       putNext = true; 
      } 
      else if (putNext && (s.substring(0, 5).equals("STRING") || s.substring(0, 2).equals("NUM"))) 
      { 
       doPrint(s); 
      } 
      else System.err.println("Invalid token!"); 
     } 
    } 

    public void doPrint(String toPrint) 
    { 
     if (toPrint.substring(0, 5).equals("STRING")) 
      System.out.println(toPrint.substring(7, toPrint.length() - 1)); 
     else if (toPrint.substring(0, 2).equals("NUM")) 
      System.out.println(toPrint.substring(4, toPrint.length() - 1)); 
     else System.err.println("Invalid printable!"); 
    } 
} 

해당 코드를 올바르게 작동시키는 법 (예 : 토큰 = { "PUT", "STRING : '안녕!'"} -> '안녕!').

나는 대답하게되어 기쁩니다!

+3

"나는 대답하게되어 기쁩니다!" 무슨 질문에? 게시물에 질문을 포함 시키십시오. – rgettman

답변

0

방금 ​​가져 왔습니다. 너무 조건부 처리 때문이었습니다.

'if'명령문을 제거해야하고 얼마 후에 작업하게됩니다.

관련 문제