저는 C--라는 가상의 프로그래밍 언어에 대한 파서를 작성합니다 (실제 C-- 언어가 아님). 나는 언어의 문법을 Pyparsing이 받아 들일 수있는 것으로 변환해야하는 무대에 다다 랐다. 불행히도 필자가 필자의 입력 문자열 (Pyparsing 오류를 일으키지 않아야 함)을 구문 분석하러 왔을 때 올바르게 구문 분석하지 않습니다. 이것이 문법 오류로 인한 것이 아닌가하는 생각이 들지만 처음으로 Pyparsing을 시작할 때 어디서 잘못 될지 모르겠습니다.Parsarsing 문법 디버깅
내가 번역 한 문법을 업로드하여 사람들이 읽을 수 있도록 here에서 업로드했습니다.
편집 : 바울의 조언으로 업데이트되었습니다.
이 내가 현재 가지고 한 문법이다 (구문 정의의 두 상단 라인은 내가 알고 나를 정말 나쁜) : 나는 '어떤 실수가 있다면 내가 좋아하는 것
# 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)
알고 문법을 가로 질러 번역했는데, 내가 준 문법을 고수하면서 간소화하기 위해 할 수있는 개선점은 무엇인가.
EDIT 2 : 새 오류가 포함되도록 업데이트되었습니다. 여기
내가 구문 분석하고 입력 문자열입니다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) ;
}
그리고 이것은 터미널에서 내 프로그램을 실행할 때 내가 오류 메시지입니다 :
/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
어떤 오류 메시지가 표시되는지와 같은 단서가 있습니까? "올바르게 구문 분석하지 못한다"고 말하면서 어떻게 알 수 있습니까? 오류가 있습니까? 잘못된 AST가 발생합니까? 더 많은 정보가 필요합니다. –
죄송합니다. 구문 분석하려고하는 입력 문자열과 터미널에있는 오류 메시지로 내 질문을 업데이트했습니다. – greenie