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 1 eclipse.preferences.version=1
2 2 encoding//morfeuszbuilder/fsa/test/testConstruction.py=utf-8
  3 +encoding//morfeuszbuilder/segrules/preprocessor.py=utf-8
3 4 encoding/buildfsa.py=utf-8
... ...
fsabuilder/buildfsa.py
... ... @@ -261,5 +261,8 @@ def main(opts):
261 261 if __name__ == '__main__':
262 262 import os
263 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 3 Created on 23 sty 2014
3 4  
... ... @@ -5,8 +6,9 @@ Created on 23 sty 2014
5 6 '''
6 7 import re
7 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 12 define = Keyword('#define').suppress() + identifier + Optional(Suppress('(') + identifier + Suppress(')')) + restOfLine + LineEnd() + StringEnd()
11 13 ifdef = Keyword('#ifdef').suppress() + identifier + LineEnd() + StringEnd()
12 14 endif = Keyword('#endif').suppress() + LineEnd() + StringEnd()
... ... @@ -52,7 +54,7 @@ def _tryToSubstituteNonArgDefine(s, t, defines):
52 54 else:
53 55 return defineName
54 56  
55   -def _processLine(line, defines):
  57 +def _processLine(lineNum, line, defines):
56 58 if line.strip():
57 59  
58 60 rule = Forward()
... ... @@ -65,7 +67,15 @@ def _processLine(line, defines):
65 67 rule.setParseAction(lambda s, l, t: ' '.join(t))
66 68 defineInstance.setParseAction(lambda s, l, t: _tryToSubstituteArgDefine(s, t, defines))
67 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 79 else:
70 80 return line
71 81  
... ... @@ -82,7 +92,7 @@ def preprocess(inputLines, defs):
82 92 name, arg, val = parsedDefine
83 93 localDefines = defines.copy()
84 94 localDefines[arg] = NonArgDefine(arg, arg)
85   - val = _processLine(val, localDefines)
  95 + val = _processLine(lineNum, val, localDefines)
86 96 defines[name] = ArgDefine(name, arg, val)
87 97 elif line.startswith('#ifdef'):
88 98 name = ifdef.parseString(line)[0]
... ... @@ -92,5 +102,5 @@ def preprocess(inputLines, defs):
92 102 elif line.startswith('#'):
93 103 yield lineNum, line
94 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 107 \ No newline at end of file
... ...