Commit a6f0d91205c224c9cd15b22b94aaf8aeefd3cd6f

Authored by Michał Lenart
1 parent ff25f748

- poprawienie wyświetlania błędów parsera reguł segmentacji

git-svn-id: svn://svn.nlp.ipipan.waw.pl/morfeusz/morfeusz@111 ff4e3ee1-f430-4e82-ade0-24591c43f1fd
fsabuilder/.settings/org.eclipse.core.resources.prefs
1 eclipse.preferences.version=1 1 eclipse.preferences.version=1
2 encoding//morfeuszbuilder/fsa/test/testConstruction.py=utf-8 2 encoding//morfeuszbuilder/fsa/test/testConstruction.py=utf-8
  3 +encoding//morfeuszbuilder/segrules/preprocessor.py=utf-8
3 encoding/buildfsa.py=utf-8 4 encoding/buildfsa.py=utf-8
fsabuilder/buildfsa.py
@@ -261,5 +261,8 @@ def main(opts): @@ -261,5 +261,8 @@ def main(opts):
261 if __name__ == '__main__': 261 if __name__ == '__main__':
262 import os 262 import os
263 opts = _parseOptions() 263 opts = _parseOptions()
264 - main(opts) 264 + try:
  265 + main(opts)
  266 + except Exception as ex:
  267 + print >> sys.stderr, unicode(ex).encode('utf8')
265 268
fsabuilder/morfeuszbuilder/segrules/preprocessor.py
  1 +# -*- coding:utf-8 -*-
1 ''' 2 '''
2 Created on 23 sty 2014 3 Created on 23 sty 2014
3 4
@@ -5,8 +6,9 @@ Created on 23 sty 2014 @@ -5,8 +6,9 @@ Created on 23 sty 2014
5 ''' 6 '''
6 import re 7 import re
7 from pyparsing import * 8 from pyparsing import *
  9 +from morfeuszbuilder.utils import exceptions
8 10
9 -identifier = Word(alphas, bodyChars=alphanums+'_>*+!') 11 +identifier = Word(alphas, bodyChars=alphanums+u'_>*+!')
10 define = Keyword('#define').suppress() + identifier + Optional(Suppress('(') + identifier + Suppress(')')) + restOfLine + LineEnd() + StringEnd() 12 define = Keyword('#define').suppress() + identifier + Optional(Suppress('(') + identifier + Suppress(')')) + restOfLine + LineEnd() + StringEnd()
11 ifdef = Keyword('#ifdef').suppress() + identifier + LineEnd() + StringEnd() 13 ifdef = Keyword('#ifdef').suppress() + identifier + LineEnd() + StringEnd()
12 endif = Keyword('#endif').suppress() + LineEnd() + StringEnd() 14 endif = Keyword('#endif').suppress() + LineEnd() + StringEnd()
@@ -52,7 +54,7 @@ def _tryToSubstituteNonArgDefine(s, t, defines): @@ -52,7 +54,7 @@ def _tryToSubstituteNonArgDefine(s, t, defines):
52 else: 54 else:
53 return defineName 55 return defineName
54 56
55 -def _processLine(line, defines): 57 +def _processLine(lineNum, line, defines):
56 if line.strip(): 58 if line.strip():
57 59
58 rule = Forward() 60 rule = Forward()
@@ -65,7 +67,15 @@ def _processLine(line, defines): @@ -65,7 +67,15 @@ def _processLine(line, defines):
65 rule.setParseAction(lambda s, l, t: ' '.join(t)) 67 rule.setParseAction(lambda s, l, t: ' '.join(t))
66 defineInstance.setParseAction(lambda s, l, t: _tryToSubstituteArgDefine(s, t, defines)) 68 defineInstance.setParseAction(lambda s, l, t: _tryToSubstituteArgDefine(s, t, defines))
67 localId.setParseAction(lambda s, l, t: _tryToSubstituteNonArgDefine(s, t, defines)) 69 localId.setParseAction(lambda s, l, t: _tryToSubstituteNonArgDefine(s, t, defines))
68 - return rule.parseString(line, parseAll=True)[0] 70 + try:
  71 + return rule.parseString(line, parseAll=True)[0]
  72 + except ParseException as ex:
  73 + msg = u'Preprocessing of segmentation rules failed.\n'
  74 + msg += line + '\n'
  75 + msg += (ex.col - 1) * ' ' + '^\n'
  76 + msg += ex.msg
  77 +# print unicode(exceptions.SegtypesException(msg)).encode('utf8')
  78 + raise exceptions.SegtypesException(msg)
69 else: 79 else:
70 return line 80 return line
71 81
@@ -82,7 +92,7 @@ def preprocess(inputLines, defs): @@ -82,7 +92,7 @@ def preprocess(inputLines, defs):
82 name, arg, val = parsedDefine 92 name, arg, val = parsedDefine
83 localDefines = defines.copy() 93 localDefines = defines.copy()
84 localDefines[arg] = NonArgDefine(arg, arg) 94 localDefines[arg] = NonArgDefine(arg, arg)
85 - val = _processLine(val, localDefines) 95 + val = _processLine(lineNum, val, localDefines)
86 defines[name] = ArgDefine(name, arg, val) 96 defines[name] = ArgDefine(name, arg, val)
87 elif line.startswith('#ifdef'): 97 elif line.startswith('#ifdef'):
88 name = ifdef.parseString(line)[0] 98 name = ifdef.parseString(line)[0]
@@ -92,5 +102,5 @@ def preprocess(inputLines, defs): @@ -92,5 +102,5 @@ def preprocess(inputLines, defs):
92 elif line.startswith('#'): 102 elif line.startswith('#'):
93 yield lineNum, line 103 yield lineNum, line
94 elif len(ifdefsStack) == 0 or all(map(lambda name: name in defs, ifdefsStack)): 104 elif len(ifdefsStack) == 0 or all(map(lambda name: name in defs, ifdefsStack)):
95 - yield lineNum, _processLine(line, defines) 105 + yield lineNum, _processLine(lineNum, line, defines)
96 106
97 \ No newline at end of file 107 \ No newline at end of file