首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让textX语法识别普通字符串和特殊关键字

如何让textX语法识别普通字符串和特殊关键字
EN

Stack Overflow用户
提问于 2021-08-22 19:57:33
回答 1查看 58关注 0票数 1

我觉得我错过了一些非常简单的东西。我正在尝试创建一个textX语法,使我的解析器能够识别普通文本标记和特殊关键字。在下面的语法中,我无法让textX识别由SpecialKeyword规则表示的[LINK ...]关键字,因为它会被更通用的NormalString规则吸收。

我得到的输入如下:

代码语言:javascript
复制
['\n', 'Text part before [LINK: REQ-001] Text part after.', '\n', 'Text part before [LINK: REQ-002] Text part after.', '\n']

虽然我希望它是:

代码语言:javascript
复制
['\n', 'Text part before ', My Link object with 'REQ-001', 'Text part after.', '\n', 'Text part before ', My Link object with 'REQ-002', 'Text part after.', '\n']

一个相关的问题是:如何使NormalString规则支持多行字符串?

代码语言:javascript
复制
from textx import metamodel_from_str

mm = metamodel_from_str('''
Text:
    parts+=TextPart;

TextPart[noskipws]:
  (NormalString | SpecialKeyword | '\n')
;

NormalString[noskipws]:
  !SpecialKeyword /(.*)?/ // this is too greedy
;

SpecialKeyword[noskipws]:
  Link // more keywords are coming later
;

Link[noskipws]:
  '[LINK: ' value = /[^\\]]*/ ']'
;
''')


textx_input = '''
Text part before [LINK: REQ-001] Text part after.
Text part before [LINK: REQ-002] Text part after.
'''


model = mm.model_from_str(textx_input, debug=False)

print(model.parts)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-23 11:19:18

你们已经很接近了。解决方案是在NormalString中的每个否定断言之后匹配单个字符,然后重复。此外,跨多行的匹配是通过(?ms)正则表达式参数实现的。

可以在the textX docs中阅读更多内容。

Link规则很常见,它会产生Python对象,所以你需要提取actual关键字,它应该是一个匹配规则,从而产生Python字符串。

以下是完整的解决方案:

代码语言:javascript
复制
from textx import metamodel_from_str

mm = metamodel_from_str('''
Text:
    parts+=TextPart;

TextPart[noskipws]:
  Link | NormalString
;

NormalString[noskipws]:
  (!SpecialKeyword /(?ms)./)*
;

SpecialKeyword:
  LinkKW // more keywords are coming later
;

LinkKW: '[LINK: ';

Link[noskipws]:
   LinkKW value = /[^\\]]*/ ']'
;
''')


textx_input = '''
Text part before [LINK: REQ-001] Text part after.
Text part before [LINK: REQ-002] Text part after.
'''


model = mm.model_from_str(textx_input, debug=True)

print(model.parts)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68884718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档