首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在textx语法中限制重复?

如何在textx语法中限制重复?
EN

Stack Overflow用户
提问于 2020-10-26 22:54:15
回答 1查看 44关注 0票数 1

我正在尝试用textx创建一个语法。

语法应如下所示:

代码语言:javascript
复制
name_a
name_a, name_b
name_a, name_b: name_c, *
name_a, name_b: name_c, *, name_d
*, name_d
*

其中,星号(*)表示“全部”。我不想让它重演。当前语法是这样的:

代码语言:javascript
复制
Subsets: ColumnsSet*;
ColumnsSet: SetItem (',' ColumnsSet)*;
SetItem: ColumnName | Star;
Star: '*';
ColumnName: name=ID (':' rename=ID)*;

它允许重复使用星号。我想要防止这种情况,所以这些行是无效的:

代码语言:javascript
复制
name_a, *, *
name_a, *, name_b, *
*, name_a, *

我应该如何重写语法?

有没有一种方法可以扁平化嵌套规则的输出:ColumnsSet: SetItem (',' ColumnsSet)*;

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-27 02:06:00

你的语法有几个问题。首先,在textX中,您需要使用assignments来收集相关数据。使用*=+=类型的赋值来表示许多0/1或多个。使用separator repetition modifiers来避免Something (',' Something)*样板文件。

为了防止*多次发生,您可以注册object processor,它可以检查语义错误。

此外,为了确保语言是面向行的,您可能需要查看noskipws规则修饰符。

textX不仅仅是一个语法分析器,它从语法中推导出you can visualize所使用的语言的元模型

这里有一个(可能不是完全的)解决方案,它可以是一个很好的开始。

代码语言:javascript
复制
from textx import metamodel_from_str, TextXSemanticError
from textx.scoping.tools import get_location

grammar = r'''
    Subsets: col_sets+=ColumnsSet;
    ColumnsSet: set_items+=SetItem[','];
    SetItem: ColumnName | Star;
    Star: '*';
    ColumnName: name=ID (':' rename=ID)?;
'''

def column_set_proc(cs):
    if len([x for x in cs.set_items if x == '*']) > 1:
        raise TextXSemanticError('Cannot use multiple * in a single line', **get_location(cs))

mm = metamodel_from_str(grammar)
mm.register_obj_processors({'ColumnsSet': column_set_proc})

# This will pass
model = mm.model_from_str(r'''name_a
name_a, name_b
name_a, name_b: name_c, *
name_a, name_b: name_c, *, name_d
*, name_d
*
''')

# Each of these raise TextXSemanticError
count = 0
for invalid in ['name_a, *, *', ' name_a, *, name_b, *', ' *, name_a, *']:
    try:
        mm.model_from_str(invalid)
    except TextXSemanticError:
        count += 1

assert count == 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64539527

复制
相关文章

相似问题

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