2009-05-22 41 views
1

我想分析在如何在解析器生成器(ANTLR,YACC等)中解析名称=值对的列表?

​​

形式的(用空格分隔)对的列表,其中:

  • 名称可以包含除空格和等号任何
  • 值可以包含不同的东西空格(包括等号)

问题在于解析器需要匹配输入,如

name1=value1 

作为单独的'NAME EQUALS VALUE'令牌,而不是作为单个'VALUE'令牌。

PS。我知道这是直接编码的微不足道,但我需要在更大的解析器的上下文中。

+0

当你说=“获取解析器名称等于VALUE令牌来匹配输入像......,你真的在​​谈论词法分析器,对不对? 为了使这项工作,它如果要看” “在您的语法分析器语法中的其他位置需要,并且在名称=值的什么上下文中可能会出现。” 您可以给出更多的上下文吗? – 2009-05-28 14:30:01

回答

1

下面是antlr中的一些东西,它解析了这个;

a=b=c=d c=d e=f 

这可能不是你需要的一切,但它应该是核心。

grammar NameValuePairs; 

pairs : namevaluepair (WS namevaluepair)*; 

namevaluepair 
    : name '=' value; 

name : ID; 

value : ID ('=' ID)*; 

WS : ' ' {skip()}; 

EQ : '='; 

ID : ~(' ' | '=')*; 
0

我认为如果VALUE可以包含等号,则最终可能会出现问题。如果可能的话,我认为将等号保留为保留字符或切换到其他保留字符表示'='会更好。

我不确定这是否适用于您的大型解析器,但您可以在空间上拆分,为您提供'NAME = VALUE'对的数组(或任何数据结构) 。然后循环访问数组,并在您使用'='的保留字符上再次分割。如果你不能改变或保留'=',你可以用正则表达式匹配'='的第一个实例。希望我没有离开基地!

0

你不需要强大的解析器名称值对,正则表达式就足够了。除非你有一些上下文或嵌套的结构,这个'工作'属于词法分析器,而不是解析器:)

+0

引用自己...“我需要在更大的分析器上下文中使用它。 - >这是一个很小的部分,它会使表达式树的叶子本身成为更大的语法定义中的一部分。 – 2009-05-26 11:49:19