識別浮點常量問題(編譯原理實驗二)

HowieLee59發表於2018-09-22

Problem Description
編譯器在對程式進行編譯之前,首先要進行語法分析。通常,程式被分解成若干個小單元,然後和語言的語法模式進行匹配。在分析表示式的時候,變數的型別在變數宣告的時候就決定了;而常量的型別需要從常量的形式來判斷。

假設你是自動編譯器(ACM)開發小組的一員,負責Pascal語言編譯器的開發。你的任務是分析程式分解模組送來的檔案,判斷其中包含的字串是否合乎語法的Pascal浮點常量。

Pascal語言對浮點常量的語法要求是:一個浮點常量除了十進位制數碼之外,必須帶有一個小數點或一個指數(緊接在字母e或E之後,在正式文件中也被稱為比例因子)。如果該浮點常量含有小數點,則在小數點兩側都至少要有一個十進位制數碼。當然,在整個浮點常量或指數之前,也許會出現符號+或-。指數不能包含小數。空格也許會出現在浮點常量的前後,但不會出現在浮點常量中間。

請注意Pascal語言的語法規則沒有對浮點數常量的取值範圍作出任何假定。
Input
輸入只有一行,就是有待識別的字串。字串的長度不超過255。
Output
請將分析的結果按以下樣例的格式輸出。如果輸入檔案中的字串是Pascal浮點常量,請輸出字串“YES”,否則輸出字串“NO”。
Sample Input

1.2

Sample Output

YES

Hint

輸入:1                                             輸出:NO 
輸入:1.0e-55                                 輸出:YES 
輸入:e-12                                       輸出:NO
輸入:1e-12                                    輸出:YES
輸入:6.5E                                       輸出:NO
輸入:+4.1234567890E-9999     輸出: YES

.

import java.util.Scanner;
import java.util.regex.Pattern;
public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String aa = sc.nextLine();
		int flag = 0;
		//String pattern = "[\\+\\-]?[0-9]*(\\.\\d+)?([eE][\\+\\-]?[0-9]+)?";
		String pattern1 = "[\\+\\-]?[0-9]+(\\.\\d+)([eE][\\+\\-]?[0-9]+)?";
		String pattern2 = "[\\+\\-]?[0-9]+(\\.\\d+)?([eE][\\+\\-]?[0-9]+)";
		//[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?
		//[\\+\\-]?[0-9]*((\\\\\\.)?[0-9]*)?([eE][\\+\\\\-]?[0-9]+)?
		//boolean isMatch = Pattern.matches(pattern, aa);
		boolean is = Pattern.matches(pattern1, aa);
		boolean i = Pattern.matches(pattern2, aa);
		//if(isMatch == true) {
		//	flag++;
		//}
		if(is == true) {
			flag++;
		}
		if(i == true) {
			flag++;
		}
		if(flag >= 1) {
			System.out.println("YES");
		}else {
			System.out.println("NO");
		}
		sc.close();
	}
}

技術太菜,沒能模擬出來,只好用正規表示式做了~

相關文章