如何在解析器生成器(ANTLR、YACC 等)中解析名称=值对的列表?
-
23-08-2019 - |
题
我想解析以下形式的(空格分隔的)对列表
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”对的数组(或您的语言将使用的任何数据结构)。然后循环遍历数组并再次分割用于“=”的保留字符。如果您无法更改或保留“=”,则可以使用正则表达式来仅匹配“=”的第一个实例。希望我没有偏离基地!
您不需要强大的名称值对解析器,正则表达式就足够了。除非你有一些上下文或嵌套结构,否则这个“工作”属于词法分析器,而不是解析器:)
不隶属于 StackOverflow