PDA

Просмотр полной версии : Реализация конечного автомата [Java|C++]


Zimper
23.02.2012, 02:19
Среда Разработки:NetBeans
Язык:Java,C++(синтаксис такой же)
Задача:

Создать текстовый файл,в который занести текст с N строк и M слов в каждой строке,
где слова созданы на языке L заданого алфавита V.Написать программу на языке java,которая выполнаяет указаные действия:

чтение строки из файла;


разбитие строки на слова при помощи регулярных выражений и запись их в колекцию;


реализация синтаксического анализатора элементов колекции при помощи конечного автомата(определить принадлежат ли слова к заданому языку)



Задный алфавит V языка L как V={<, 0...5, P...Z, +, -, >}.
Слова имеют такое синтактическое построение:каждое слово обязательно начинаеться словом '<',потом обязательно следует символ '+' или '-',за которым следует последовательность символов “0...5” или “P...Z”.В конце размещаеться символ '>'.
Разделители слов в строке: '(' или ')' или '^'.



*************************
*Main.java *
*************************

package javaapplication2;
import java.util.LinkedList;
import java.io.FileReader;
import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author Zimper
*/

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args)
throws Exception{
FileReader file;
LinkedList list=new LinkedList();

file=new FileReader(new File("D:\\test.txt"));
char[] a=new char[100];
file.read(a);
String exp=String.valueOf(a);
System.out.println(exp);
String regex="[<]([+]|[-])([0-5]+|[P-Z]+)[>]";
String regex2="([(]|[)]|[^ ])[<]([+]|[-])?([0-9]+|[A-Z]+)[>]";
String regex3="[<]([+]|[-])([0-9]+|[A-Z]+)[>]";
Pattern pat=Pattern.compile(regex),pat2=Pattern.compile(re gex2),pat3=Pattern.compile(regex3);
Matcher m=pat3.matcher(exp);
if(m.find())
{
int index=0;
System.out.println("Word"+index+":"+m.group());
list.add(index,m.group());
m=pat2.matcher(exp);
String test0;
index=1;
while(m.find())
{
test0=m.group();
list.add(index,test0.subSequence(1, test0.length()));
System.out.println("Word"+index+":"+list.get(index));
index++;
}
System.out.println("___________________________");
int size=list.size();

for(int i=0;i<size;i++)
{
Matcher check=pat.matcher((CharSequence)list.get(i));
boolean res=check.matches();
int bool=0;

if(res)
{
bool=1;
}
else
{
bool=0;
}

switch(bool)
{
case 0:System.out.println(list.get(i)+" -> "+"false");break;
case 1:System.out.println(list.get(i)+" -> "+"true");break;
}

}
}






try
{
Thread.sleep(70000);
}
catch(Exception ex)
{
}
}

}




Пример содержимого файла:
<+PZ>^<-PZXW>(<+4534>^<+PZ>)<PZXW>

Результат:
http://www.pictureshack.ru/images/3972avtomat.gif