Parsing 这种语法需要什么类型的解析器?

Parsing 这种语法需要什么类型的解析器?,parsing,grammar,Parsing,Grammar,我有一个语法,我不知道我需要什么类型的解析器来解析它,除了我不相信这个语法是LL(1)。我想我需要一个具有回溯或某种LL(*)的解析器。我提出的语法(可能需要重写)是: 我试图生成的语言如下所示: abc = def g hi jk lm xy = aaa bbb ccc ddd eee fff jjj kkk foo = bar ha ha 零个或多个规则,其中包含左标识符,后跟等号,后跟一个或多个标识符。我认为我在编写解析器时会遇到一个问题,语法允许规则中有任意数量的id,而判断新规则何

我有一个语法,我不知道我需要什么类型的解析器来解析它,除了我不相信这个语法是LL(1)。我想我需要一个具有回溯或某种LL(*)的解析器。我提出的语法(可能需要重写)是:

我试图生成的语言如下所示:

abc = def g hi jk lm
xy = aaa bbb ccc ddd eee fff jjj kkk
foo = bar ha ha 
零个或多个规则,其中包含左标识符,后跟等号,后跟一个或多个标识符。我认为我在编写解析器时会遇到一个问题,语法允许规则中有任意数量的id,而判断新规则何时启动的唯一方法是找到id=,这需要回溯


有人知道这种语法的分类和最好的解析方法吗?对于手工编写的解析器来说?

生成标识符、等号和有限标识符序列的语法是规则的。这意味着可以使用DFA或正则表达式解析语言中的字符串。不需要花哨的不确定性或LL(*)解析器

为了确保语言是正则的,让Id=U{a:a∈ },在哪里⊂ ∑是标识符中可能出现的符号集。您试图生成的语言由正则表达式表示

  • Id+=(Id+)*Id+
设置Γ={a,b,…,z},正则表达式语言中的字符串示例如下:

  • 我用的是正规语言
  • 嘿=这意味着我可以被dfa识别
  • cool=甚至是正则表达式
没有必要使用强大的解析技术来解析您的语言。在这种情况下,使用正则表达式或DFA进行解析既合适又优化

编辑:

调用上面的正则表达式R。要解析R*,生成识别R*语言的DFA。为此,使用可从克莱恩定理获得的算法生成识别R*语言的NFA。然后使用子集构造将NFA转换为DFA。结果DFA将识别R*中的所有字符串。给定构造的DFA在实现语言中的表示形式,所需的操作-例如

  • 将解析的最后一个标识符添加到正在解析的当前声明语句的右侧
  • 将解析的最后一条声明语句添加到解析的声明列表中,并使用解析的最后一个标识符开始解析新的声明语句

可以编码为DFA的状态。实际上,对于这样一种简单的语言,使用Kleene定理和子集构造可能是不必要的。也就是说,您可能只需要编写具有上述两个操作的解析器,而无需实现自动机。对于更复杂的规则语言(例如,编程语言的词汇结构),转换将是最好的选择。

但是,响应很好,我如何在递归下降解析器中确定特定规则结束并开始新规则时,没有任何奇特的方法。因为它不仅必须生成一个标识符,后跟一个等号,后跟一个标识符的有限序列,还必须允许这些标识符的有限集合。我猜应该是LL(3)?最后一条规则不需要在RHS上的“id”之前或之后包含一个额外的“id”吗?
abc = def g hi jk lm
xy = aaa bbb ccc ddd eee fff jjj kkk
foo = bar ha ha