我想分析在如何在解析器生成器(ANTLR,YACC等)中解析名称=值对的列表?
形式的(用空格分隔)对的列表,其中:
- 名称可以包含除空格和等号任何
- 值可以包含不同的东西空格(包括等号)
问题在于解析器需要匹配输入,如
name1=value1
作为单独的'NAME EQUALS VALUE'
令牌,而不是作为单个'VALUE'
令牌。
PS。我知道这是直接编码的微不足道,但我需要在更大的解析器的上下文中。
我想分析在如何在解析器生成器(ANTLR,YACC等)中解析名称=值对的列表?
形式的(用空格分隔)对的列表,其中:
问题在于解析器需要匹配输入,如
name1=value1
作为单独的'NAME EQUALS VALUE'
令牌,而不是作为单个'VALUE'
令牌。
PS。我知道这是直接编码的微不足道,但我需要在更大的解析器的上下文中。
下面是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 : ~(' ' | '=')*;
我认为如果VALUE可以包含等号,则最终可能会出现问题。如果可能的话,我认为将等号保留为保留字符或切换到其他保留字符表示'='会更好。
我不确定这是否适用于您的大型解析器,但您可以在空间上拆分,为您提供'NAME = VALUE'对的数组(或任何数据结构) 。然后循环访问数组,并在您使用'='的保留字符上再次分割。如果你不能改变或保留'=',你可以用正则表达式匹配'='的第一个实例。希望我没有离开基地!
你不需要强大的解析器名称值对,正则表达式就足够了。除非你有一些上下文或嵌套的结构,这个'工作'属于词法分析器,而不是解析器:)
引用自己...“我需要在更大的分析器上下文中使用它。 - >这是一个很小的部分,它会使表达式树的叶子本身成为更大的语法定义中的一部分。 – 2009-05-26 11:49:19
当你说=“获取解析器名称等于VALUE令牌来匹配输入像......,你真的在谈论词法分析器,对不对? 为了使这项工作,它如果要看” “在您的语法分析器语法中的其他位置需要,并且在名称=值的什么上下文中可能会出现。” 您可以给出更多的上下文吗? – 2009-05-28 14:30:01