LL(1)文法判定的java实现方法
LL(1)文法
LL(1)文法由三个部分组成
- First集合
顾名思义,可知First(S)即为符合文法的字符串中可能出现在S符号前的终结符或非终结符组成的的集合
- Follow集合
和First的定义类似
- Select集合
该集合是用来判定文法是否为LL(1)文法的集合
代码组成
首先创建一个文件用来将文法读入程序中
文件内容
S
SABCD
abcd
S->AB
S->bC
A->&
A->b
B->&
B->aD
C->AD
C->b
D->aS
D->c
grammer类
定义的变量 p保存产生式 S保存起始符
private Map<Character,List<List<Character>>> P= new HashMap<>();
private Set<Character> VN=new HashSet<>();//非终止符
private Set<Character> VT=new HashSet<>();//终止符
private Character S;
读取文件内容保存到内存中
public Grammar(String fileNamePath)
{
File file=new File(fileNamePath);
if(!file.exists()||!file.isFile())
{
System.err.println("文件不存在");
return;
}
Init(file);
}
private void Init(File file)
{
try(BufferedReader bufferedReader=new BufferedReader(new FileReader(file))) {
String str;
int i=0;
while ((str=bufferedReader.readLine())!=null)
{
i++;
if(i==1)
{
if(str.trim()!="")
{
S=str.charAt(0);
}
}
else if(i==2||i==3)
{
for (int j=0;j<str.length();j++)
{
Character c=str.charAt(j);
if(c!=' ')