PLY yacc解析器:如何创建用于解析矩阵的递归规则?

问题描述 投票:0回答:1

我正在尝试解析以这种方式编写的矩阵:[[1,2];[3,2];[3,4]]

因此,矩阵语法的形式为:[[A0,0, A0,1, ...]; [A1,0, A1,1, ...];...]

>用于分隔矩阵的行,因此在只有一行的矩阵的分配中不存在。另一方面,逗号]用于分隔矩阵的列,另一方面,在仅具有一列的矩阵的分配中将不会出现。现在,我的问题是:如何解析大小可变的矩阵?我猜想在yacc中使用递归规则,但是怎么做呢?每次尝试都会导致无限递归。

这是我得到的错误:

WARNING: Symbol 'primary' is unreachable WARNING: Symbol 'expr' is unreachable ERROR: Infinite recursion detected for symbol 'primary' ERROR: Infinite recursion detected for symbol 'expr'

当我尝试这种代码时:

def p_test(t): '''primary : constant | LPAREN expr RPAREN''' print('yo') t[0] = 1 def p_expression_matrice(t): '''expr : primary | primary '+' primary''' print('hey') t[0] = 1

(这只是我第一次尝试了解如何在yacc中编写递归,甚至没有解决我真正的问题)

这是我的词汇

from global_variables import tokens import ply.lex as lex t_PLUS = r'\+' t_MINUS = r'\-' t_TIMES = r'\*' t_DIVIDE = r'\/' t_MODULO = r'\%' t_EQUALS = r'\=' t_LPAREN = r'\(' t_RPAREN = r'\)' t_LBRACK = r'\[' t_RBRACK = r'\]' t_SEMICOLON = r'\;' t_COMMA = r'\,' t_POWER = r'\^' t_QUESTION = r'\?' t_NAME = r'[a-zA-Z]{2,}|[a-hj-zA-HJ-Z]' # all words (only letters) except the word 'i' alone t_COMMAND = r'![\x00-\x7F]*' # all unicode characters after '!' def t_NUMBER(t): r'\d+(\.\d+)?' try: t.value = int(t.value) except: t.value = float(t.value) return t def t_IMAGINE(t): r'i' t.value = 1j return t t_ignore = " \t" def t_error(t): print("Illegal character '%s'" % t.value[0]) t.lexer.skip(1) lexer = lex.lex()
我正在尝试解析以这种方式编写的矩阵:[[1,2]; [3,2]; [3,4]]因此,矩阵语法的形式为:[[A0,0,A0, 1,...]; [A1,0,A1,1,...]; ...]分号用于分隔...的行...] 

经过多次尝试,我得到了这个:

def p_test3(t): '''expression : expression SEMICOLON expression''' t[0] = [] t[0].append(t[1]) t[0].append(t[3]) def p_test2(t): '''expression : LBRACK expression RBRACK''' t[0] = t[2] def p_test(t): '''expression : expression COMMA NUMBER''' t[0] = [] try: for i in t[1]: t[0].append(i) except: t[0].append(t[1]) t[0].append(t[3])

这使我可以解析此[[1,2,3,4,5];[5,4,3,2,1]]以获得此:[[1, 2, 3, 4, 5], [5, 4, 3, 2, 1]]存储在数组数组中。下一步,我将其中许多存储在字典中,并且我会继续前进,感谢@rici的支持:)
parsing matrix yacc ply
1个回答
0
投票
经过多次尝试,我得到了这个:

def p_test3(t): '''expression : expression SEMICOLON expression''' t[0] = [] t[0].append(t[1]) t[0].append(t[3]) def p_test2(t): '''expression : LBRACK expression RBRACK''' t[0] = t[2] def p_test(t): '''expression : expression COMMA NUMBER''' t[0] = [] try: for i in t[1]: t[0].append(i) except: t[0].append(t[1]) t[0].append(t[3])

© www.soinside.com 2019 - 2024. All rights reserved.