Commit a6f0d91205c224c9cd15b22b94aaf8aeefd3cd6f
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
Showing
3 changed files
with
20 additions
and
6 deletions
fsabuilder/.settings/org.eclipse.core.resources.prefs
fsabuilder/buildfsa.py
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 |
... | ... |