首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铺层条件规则

铺层条件规则
EN

Stack Overflow用户
提问于 2022-06-14 07:05:24
回答 1查看 55关注 0票数 0

我怎样才能处理一到多条规则呢?

代码语言:javascript
复制
tokens = (
    'VAR1',
    'VAR2',
    'TRUE',
    'SINGLE_CHAR',
)

def t_VAR1(t):
    r'var1'
    return t

def t_VAR2(t):
    r'var2'
    return t

def t_TRUE(t):
    r't|T'
    return t

def t_SINGLE_CHAR(t):
    r'[A-Za-z]'
    return t

如果我有两条规则。

代码语言:javascript
复制
def p_expression_variable2(p):
    '''variable2 : VAR2 SINGLE_CHAR'''
    print("got VAR2")

def p_expression_variable1(p):
    '''variable1 : VAR1 TRUE'''
    print("got VAR1")

我想制定规则,以便var1 Tp_expression_variable1匹配,var2 Tp_expression_variable2匹配。但是由于t_TRUEt_SINGLE_CHAR的一个子集,所以T总是与t_TRUE匹配,从而产生错误。

我是lex和yacc的新手,想知道如何处理这类问题的规则。我知道它可以通过条件词法(定义两种状态)来处理,但是有办法用单一状态来处理吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-14 14:14:10

不是以你想做的方式。

在yacc/lex解析模型中,不考虑解析器的状态进行词法分析。这就是将句法分析和词法分析分离成不同的组成部分的要点。如果您希望它们以您建议的方式进行交互,您将不得不使用无扫描分析器,但这涉及到一定的成本,包括语法复杂性和解析算法,因为生成的语法不太可能只适用于单个字符的前瞻性。

使用lex/yacc框架,您可以使用多个词法状态,但这需要解析器向词法分析器反馈,通常使用中间规则行动 (通常不支持),或者在词法分析器中手工构建的状态机中复制部分语法分析。这两种解决方案都是不优雅的、不可扩展的和不必要的笨重。(尽管如此,它们比人们可能希望的还要普遍。)

您可以做的是使词法分析明确:

代码语言:javascript
复制
def t_TRUE(t):
    r'[tT]'
    return t

def t_SINGLE_CHAR(t):
    r'[A-SU-Za-su-z]'
    return t

并在解析器中实现一种词法回退:

代码语言:javascript
复制
def p_any_char(p):
    '''any_char : SINGLE_CHAR
                | TRUE
    '''
    p[0] = p[1]

def p_expression_variable2(p):
    '''variable2 : VAR2 any_char'''
    print("got VAR2")

def p_expression_variable1(p):
    '''variable1 : VAR1 TRUE'''
    print("got VAR1")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72612777

复制
相关文章

相似问题

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