我想以以下形式解析(空格分隔)对的列表
name1=value1 name2=value2 ...
在哪里:
- NAME 可以包含除空格和等号以外的任何内容
- VALUE 可以包含除空格以外的任何内容(包括等号!)
问题是让解析器匹配输入
name1=value1
作为单独'NAME EQUALS VALUE'
的令牌,而不是作为单个'VALUE'
令牌。
PS。我知道这对于直接编码来说是微不足道的,但我需要在更大的解析器的上下文中使用它。
我想以以下形式解析(空格分隔)对的列表
name1=value1 name2=value2 ...
在哪里:
问题是让解析器匹配输入
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”对。然后循环遍历数组并在您用于“=”的保留字符上再次拆分。如果您无法更改或保留“=”,您可以使用正则表达式来匹配“=”的第一个实例。希望我不会偏离基地!
对于名称值对,您不需要强大的解析器,正则表达式就足够了。除非你有一些上下文或嵌套结构,否则这个“工作”属于词法分析器,而不是解析器:)