Tôi đang tạo trình phân tích cú pháp cho ngôn ngữ lập trình ảo gọi là C-- (không phải ngôn ngữ C-- thực tế). Tôi đã lên sân khấu nơi tôi cần dịch ngữ pháp của ngôn ngữ sang một thứ gì đó mà Pyparsing có thể chấp nhận. Thật không may khi tôi đến để phân tích chuỗi đầu vào của tôi (đó là chính xác và không nên gây ra Pyparsing để lỗi) nó không phân tích cú pháp chính xác. Tôi lo sợ điều này là do lỗi trong ngữ pháp của tôi, nhưng khi tôi bắt đầu Pyparsing lần đầu tiên, tôi dường như không thể nhìn thấy nơi tôi đang đi sai.Gỡ lỗi Pyparsing Grammar
Tôi đã tải lên ngữ pháp mà tôi đang dịch từ here để mọi người đọc qua.
EDIT: Cập nhật với lời khuyên của Paul.
Đây là ngữ pháp Tôi hiện đã có (hai dòng đầu Cú pháp định nghĩa là khủng khiếp xấu của tôi, tôi biết):
# Lexical structure definition
ifS = Keyword('if')
elseS = Keyword('else')
whileS = Keyword('while')
returnS = Keyword('return')
intVar = Keyword('int')
voidKeyword = Keyword('void')
sumdiff = Literal('+') | Literal('-')
prodquot = Literal('*') | Literal('/')
relation = Literal('<=') | Literal('<') | Literal('==') | \
Literal('!=') | Literal('>') | Literal('=>')
lbrace = Literal('{')
rbrace = Literal('}')
lparn = Literal('(')
rparn = Literal(')')
semi = Literal(';')
comma = Literal(',')
number = Word(nums)
identifier = Word(alphas, alphanums)
# Syntax definition
term = ''
statement = ''
variable = intVar + identifier + semi
locals = ZeroOrMore(variable)
expr = term | OneOrMore(Group(sumdiff + term))
args = ZeroOrMore(OneOrMore(Group(expr + comma)) | expr)
funccall = Group(identifier + lparn + args + rparn)
factor = Group(lparn + expr + rparn) | identifier | funccall | number
term = factor | OneOrMore(prodquot + factor)
cond = Group(lparn + expr + relation + expr + rparn)
returnState = Group(returnS + semi) | Combine(returnS + expr + semi)
assignment = Group(identifier + '=' + expr + semi)
proccall = Group(identifier + lparn + args + rparn + semi)
block = Group(lbrace + locals + statement + rbrace)
iteration = Group(whileS + cond + block)
selection = Group(ifS + cond + block) | Group(ifS + cond + block + elseS + block)
statement = OneOrMore(proccall | assignment | selection | iteration | returnState)
param = Group(intVar + identifier)
paramlist = OneOrMore(Combine(param + comma)) | param
params = paramlist | voidKeyword
procedure = Group(voidKeyword + identifier + lparn + params + rparn + block)
function = Group(intVar + identifier + lparn + params + rparn + block)
declaration = variable | function | procedure
program = OneOrMore(declaration)
Tôi muốn biết nếu có bất kỳ sai lầm tôi đã thực hiện việc dịch ngữ pháp và những cải tiến mà tôi có thể làm để làm cho nó đơn giản hóa trong khi tôn trọng ngữ pháp mà tôi đã đưa ra.
CHỈNH SỬA 2: Đã cập nhật để bao gồm lỗi mới.
Đây là chuỗi đầu vào tôi đang phân tích cú pháp:
int larger (int first , int second) {
if (first > second) {
return first ;
} else {
return second ;
}
}
void main (void) {
int count ;
int sum ;
int max ;
int x ;
x = input () ;
max = x ;
sum = 0 ;
count = 0 ;
while (x != 0) {
count = count + 1 ;
sum = sum + x ;
max = larger (max , x) ;
x = input () ;
}
output (count) ;
output (sum) ;
output (max) ;
}
Và đây là thông báo lỗi tôi nhận được khi chạy chương trình của tôi từ Terminal:
/Users/Joe/Documents/Eclipse Projects/Parser/src/pyparsing.py:1156: SyntaxWarning: null string passed to Literal; use Empty() instead
other = Literal(other)
/Users/Joe/Documents/Eclipse Projects/Parser/src/pyparsing.py:1258: SyntaxWarning: null string passed to Literal; use Empty() instead
other = Literal(other)
Expected ")" (at char 30), (line:6, col:26)
None
Bạn có bất kỳ manh mối nào cho chúng tôi, chẳng hạn như thông báo lỗi nào bạn nhận được (nếu có)? Bạn nói "nó không phân tích cú pháp chính xác" nhưng làm thế nào để bạn biết điều đó? Có lỗi không? Nó tạo ra một AST không chính xác? Cần thêm thông tin. –
Xin lỗi về điều đó. Tôi đã cập nhật câu hỏi của mình với chuỗi đầu vào mà tôi đang cố phân tích cú pháp và các thông báo lỗi tôi nhận được trong Terminal. – greenie