antlr - 选择性地标记字符串

时间:2017-12-11 18:26:48

标签: antlr4

我是Antlr的新手,我正在尝试编写语法来选择性地标记字符串。我真的很感激任何关于在哪里寻找的帮助/指针以及实现这一目标的方法。

例如,字符串“disabled”出现在各个地方的设备输出中,

section1 {
  property1 disabled 
}
section2 {
  disabled
}
section3 {
  property2 disabled
}

语法:

section2  
: 'section2' '{'
'disabled' a_disabled=NL
'}'
;

这最终会对字符串'disabled'进行标记,从而导致将“”分配给property1和property2,而意图是将第2部分中的“disabled”标记为“disabled”并将其分配给a_disabled。 预期的json输出为:

{"section1": 
   {
     "property1": "disabled"
   },
 "section2":
   {
     "disabled": "true",
   },
 "section3":
   {
     "property2": "disabled"
   },
}

我编写的代码是为了正确地将section2:disabled分配给“true”,但是因为这个而将property1和property2值赋值为“”。

{"section1": 
   {
     "property1": ""
   },
 "section2":
   {
     "disabled": "true",
   },
 "section3":
   {
     "property2": ""
   },
}

Antlr调试输出显示所有出现的“已禁用”都被标记化。

实现这一目标的最佳方法是什么?通过文档后,模式或语义谓词似乎可行。我们也在使用Antlr 4.7和Go。

1 个答案:

答案 0 :(得分:0)

我不太确定你要从描述中实现什么,而且还不清楚你想如何“选择性地标记字符串”,但是这个语法怎么样:

section: ID '{' ID? 'disabled' '}'

WS : [ \n\u000D] -> skip ; 
ID : [a-zA-Z] [a-zA-Z0-9]* ;

然后在解析树上执行其余的操作?如果您提供更多信息,我会更新答案。