डीबगिंग मैं एक काल्पनिक प्रोग्रामिंग भाषा के लिए एक पार्सर बना रहा हूं जिसे सी-- (वास्तविक सी-- भाषा नहीं) कहा जाता है। मैं उस मंच पर पहुंच गया हूं जहां मुझे भाषा के व्याकरण को कुछ पिपर्सिंग स्वीकार कर सकते हैं। दुर्भाग्यवश जब मैं अपनी इनपुट स्ट्रिंग को पार्स करने के लिए आया हूं (जो सही है और पाइपर्सिंग को त्रुटि नहीं देनी चाहिए) यह सही ढंग से पार्सिंग नहीं कर रहा है। मुझे डर है कि यह मेरे व्याकरण में त्रुटियों के कारण है, लेकिन जैसा कि मैं पहली बार पाइपर्सिंग शुरू कर रहा हूं, मुझे लगता है कि मैं कहां गलत हो रहा हूं।पाइपर्सिंग व्याकरण
मैंने व्याकरण अपलोड किया है जिसे मैं पढ़ने के लिए 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)
मैं चाहते हैं, तो वहाँ कोई गलती मैं कर रहे हैं पता करने के लिए मैंने व्याकरण का अनुवाद करने में क्या किया है और मुझे जो व्याकरण दिया गया है, उसका पालन करते हुए इसे सरल बनाने के लिए मैं क्या कर सकता हूं।
संपादित करें 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
क्या आपके पास हमारे लिए कोई संकेत है, जैसे कि आपको क्या त्रुटि संदेश मिल रहा है (यदि कोई है)? आप कहते हैं "यह सही ढंग से पार्स नहीं कर रहा है" लेकिन आप इसे कैसे जानते हैं? क्या कोई त्रुटि है? क्या यह गलत एएसटी उत्पन्न कर रहा है? अधिक जानकारी की आवश्यकता है। –
इसके बारे में क्षमा करें। मैंने इनपुट स्ट्रिंग के साथ अपना प्रश्न अपडेट कर लिया है जिसे मैं पार्सल करने में प्रयास कर रहा हूं और टर्मिनल में त्रुटि संदेश प्राप्त कर रहा हूं। – greenie