2014-08-30 2 views
0

입력을 검사하고 입력 문자열에서 발견 된 어휘를 나타내는 String을 반환하는 메서드를 작성하려고합니다. 숫자를 스캔하고 입력 스트림에서 어휘를 반환 - Java?

는/내가 지금까지 가지고 있지만 나는 모든 도움을 주시면 감사하겠습니다 direction-- 권리 :

private String scanNumbers(char input) 
{ 
    String result= ""; 
    int value = in.read() 
    if(value != -1) 
    { 
     If(isDigit(input)) 
     { 
     result = Integer.toString(value); 
     } 
    } 
return result; 
} 

public static boolean isDigit(char input) 
{ 
    return (input >= '0' && input <= '9'); 
} 

감사합니다 내가 분석에 새로운 오전에 갈거야 경우 나도 몰라 무엇인가 어휘/컴파일러.

+0

어휘가 십진수만으로 구성되어있는 것은 아닙니다. 조심해야 할 것은'System.in.read()'는 반드시 다음 문자가 아닌 다음 바이트를 스트림에 반환한다는 것입니다. 문자는 여러 바이트로 구성 될 수 있습니다. – markspace

+0

숫자를 얻을 때까지 계속 읽을 수있는 방법이 있습니까? – Surz

+0

[InputStreamReader.] (http://docs.oracle.com/javase/tutorial/i18n/text/stream.html) – markspace

답변

0

소개

Questions that appear to be related to a homework exercise are often slow to be answered on SO. 마감 기한이 지날 때까지 기다리는 경우가 종종 있습니다!

당신은 파싱/lexemes/컴파일러의 주제를 처음 접했고 입력을 검사하고 입력 문자열에서 발견 된 어휘를 나타내는 문자열을 반환하는 Java 메소드 작성에 도움이 필요합니다. 나중에 숫자를 찾을 때까지 문자를 건너 뛰는 방법을 원함을 나타냅니다.

당신이 달성하고자하는 것에 충돌을 일으키는 질문에 혼란이 있습니다.

더 큰 컴파일러 프로젝트의 일부로 Java에서 어휘 분석을 배우고 싶다면, 기존 도구 또는이 작업을 수행하는 방법을 찾고 있는지 여부에 관계없이 숫자로만 할 것인지 여부에 관계없이 명확하지 않습니다. 또는 그러한 방법을 직접 프로그래밍하는 방법을 배우려고합니다. 프로그래밍을하는 경우 숫자를 읽는 것만 알 필요가 있는지, 아니면 원하는 일의 예일뿐입니다. 또한 주사라고도

어휘 분석

어휘 분석은 문자로 구성되는 텍스트의 언어 자료를 판독하는 방법이다. 이는 데이터 입력, 서면 자료의 언어 학적 분석 (단어 빈도 계산과 같은) 또는 언어 편집 또는 해석의 일부와 같은 여러 목적으로 수행 될 수 있습니다. 컴파일의 일부로 완료되면 구문 분석, 의미 분석, 코드 생성, 최적화 등을 포함하는 일련의 단계 중 하나 (일반적으로 첫 번째)입니다. 컴파일러 작성시 code generator tools이 일반적으로 사용되므로 자바로 컴파일러를 작성하려면 Java 어휘 생성기와 Java 파서 생성기를 사용하여 해당 컴파일러 구성 요소에 대한 Java 코드를 작성해야합니다. 때로는 렉서와 파서가 손으로 쓴 것이지만, 초보자에게는 권장 작업이 아닙니다. 컴파일러 작성 전문가가 툴 세트보다 손으로 컴파일러를 만드는 것이 필요합니다. 때로는 수업 연습으로 학생들은 과정을 이해하는 데 도움이되는 부분 어휘 분석을 수행하도록 코드를 작성해야하지만, 이는 운동과 같은 몇 가지 어휘를위한 경우가 많습니다.

어휘 어휘은 어휘 분석기가 인식하는 개별 엔티티를 구성하는 문자 시퀀스를 설명하는 데 사용됩니다. 인식되면 대개 토큰으로 표시됩니다. 따라서 어휘는 어휘 분석 과정의 일부로 토큰으로 대체됩니다. 어휘 분석기는 나중에 어휘를 토큰으로 바꾸기 전에 나중에 사용하기 위해 어휘 테이블에 어휘를 기록합니다. 이것은 프로그램의 식별자가 컴파일러에 기록되는 방식입니다.

Java에서 렉서를 작성하기위한 몇 가지 도구가 있습니다. 가장 일반적인 두 가지는 JlexJFlex입니다.건너 뛰는 공백 동안 정수를 인식, 작동 방법을 설명하기 위해 사용하는 것과 following rules : 그 작업을 달성하기 위해 자바 메소드를 생성하는 도구에 의해 처리 될 수

%% 
WHITE_SPACE_CHAR=[\n\ \t\b\012] 
DIGIT=[0-9] 
%% 
{WHITE_SPACE_CHAR}+ { } 
{DIGIT}+ { return(new Yytoken(42,yytext(),yyline,yychar,yychar + yytext().length())); } 
%% 

.

어휘를 설명하는 데 사용되는 표기는 보통 regular expressions으로 작성됩니다. 컴퓨터 과학 이론은 어휘 분석기 프로그래밍에 도움이 될 수 있습니다. 정규식은 finite state automata의 형식으로 나타낼 수 있습니다. 루프 내부 스위치를 포함하는 특정 style of coding that can be used to match lexemes that experienced programers would recognise and use in this situation가있다 :

while (! eof) { 
    switch (next_symbol()) { 

    case symbol: 
     ... 
    break; 
    default: 
     error(diagnostic); break; 
    } 
} 

그것은 종종 간단한 어휘 프로그래밍 운동이 학생들에게 소개하기위한 것입니다 이러한 개념입니다. 방법 중 모든 예비 설명과 함께

자바에서

토큰 화는 자바 코드 당신이 조각에 내려 수 있습니다. 주석에서 언급했듯이 문자는 유니 코드로 2 바이트로 표시되므로 바이트 수는 input stream and reading characters에서 Java 사이에 차이가 있습니다. 문자 처리 방법 내에서 바이트 읽기를 사용했습니다.

입력 스트림에서, 특히 데이터 입력을 인식하는 단순한 토큰은 Java가 specific built-in class for that called the StreamTokenizer 인 일반적인 활동입니다.

우리는 예를 들어, 다음과 같은 방법으로 작업을 구현할 수 :

// create a new tokenizer 
    Reader r = new BufferedReader(new InputStreamReader(System.in)); 
    StreamTokenizer st = new StreamTokenizer(r); 

    // print the stream tokens 
    boolean eof = false; 
    do { 

     int token = st.nextToken(); 
     switch (token) { 
      case StreamTokenizer.TT_EOF: 
       System.out.println("End of File encountered."); 
       eof = true; 
       break; 
      case StreamTokenizer.TT_EOL: 
       System.out.println("End of Line encountered."); 
       break; 
      case StreamTokenizer.TT_NUMBER: 
       System.out.println("Number: " + st.nval); 
       break; 
      default: 
       System.out.println((char) token + " encountered."); 
       if (token == '!') { 
       eof = true; 
       } 
     } 
    } while (!eof); 

그러나이 숫자의 어휘의 문자열을 반환하지 않습니다 만 번호와 일치하고 값을 가져옵니다.

귀하의 질문에 그 태그가 있었기 때문에 Java class java.util.scanner을 발견했습니다. 이것은 simlar 작업을 수행 할 수있는 또 다른 클래스입니다. 우리는이 같은 입력으로부터 정수 어휘를 얻을 수 : 원치 않는 문자를 스킵 정수의 어휘를 찾기 위해 원래의 코드를 다시 작성할 수 있습니다,

Scanner s = new Scanner(System.in); 
System.out.println(s.nextInt()); 

솔루션 마지막으로

하는 I java regular expression matching을 사용하십시오.

import java.io.IOException; import java.io.InputStreamReader; 
import java.util.regex.Pattern; 
public class ReadNumbers { 
    static InputStreamReader in = null;   // Have input source as a global 
    static int value = -1;       // and the current input value  
    public static void main (String [] args) { 
     try { 
      in = new InputStreamReader(System.in); // Set up the input 
      value = in.read();      // pre-fill the input state    
      System.out.println(scanNumbers()) ;    
     } 
     catch (Exception e) { 
      e.printStackTrace();   // print error 
     } 
    } 
    private static String scanNumbers() { 
     String SkipCharacters = "\\s" ;   // Characters that can be skipped 
     String result= "";      // empty string to store lexeme 
     int charcount=0; 
     try { 
      while ((value != -1) && Pattern.matches(SkipCharacters,"" + (char)value)) 
       // Now skip optional characters before the number 
       value = in.read() ;    // pre-load the next character 
      while ((value != -1) && isDigit((char)value)) { 
       // Now find the number digits 
       result = result + (char)value; // append digit character to result 
       value = in.read() ;    // pre-load the next character 
      } 
     } finally { 
      return result; 
     } 
    } 
    public static boolean isDigit(char input) { 
     return (input >= '0' && input <= '9'); 
    } 
} 

후문

는 지적 모든 숫자 용도로만 진수과 마찬가지로 @markspace에서 주석이 재미 있고 유용합니다. 16 진수와 같은 다른 기준의 숫자를 고려하십시오. Java allows integer constants to be specified in those number bases which do not just use the digits 0..9.

관련 문제