1

我想以以下形式解析(空格分隔)对的列表

name1=value1 name2=value2 ...

在哪里:

  • NAME 可以包含除空格和等号以外的任何内容
  • VALUE 可以包含除空格以外的任何内容(包括等号!)

问题是让解析器匹配输入

name1=value1

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

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

4

3 回答 3

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  :  ~(' ' | '=')*;
于 2009-06-19T11:39:56.613 回答
0

如果 VALUE 可以包含等号,我认为您最终可能会遇到问题。如果可能的话,我认为最好将等号设为保留字符,或者切换到不同的保留字符来表示“=”。

我不确定这是否可以在您的较大解析器的上下文中工作,但您可以在空间上拆分,为您提供一个数组(或您的语言将使用的任何数据结构)“NAME=VALUE”对。然后循环遍历数组并在您用于“=”的保留字符上再次拆分。如果您无法更改或保留“=”,您可以使用正则表达式来匹配“=”的第一个实例。希望我不会偏离基地!

于 2009-05-22T13:59:53.710 回答
0

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

于 2009-05-22T14:04:19.083 回答