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

name1=value1 name2=value2 ...

在哪里:

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

问题是让解析器匹配输入,例如

name1=value1

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

附言。我知道直接编码很简单,但我需要在更大的解析器的上下文中使用它。

有帮助吗?

解决方案

这是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”对的数组(或您的语言将使用的任何数据结构)。然后循环遍历数组并再次分割用于“=”的保留字符。如果您无法更改或保留“=”,则可以使用正则表达式来仅匹配“=”的第一个实例。希望我没有偏离基地!

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top