summaryrefslogtreecommitdiff
path: root/prolog/common.py
diff options
context:
space:
mode:
authorAleksander Sadikov <aleksander.sadikov@fri.uni-lj.si>2016-02-29 03:24:17 +0100
committerAleksander Sadikov <aleksander.sadikov@fri.uni-lj.si>2016-02-29 03:24:17 +0100
commite756acb31c54558ee16a0bbcda13f991b7d4f714 (patch)
tree9878d7e1236d9eb8f077c9517bb9165a7a43df90 /prolog/common.py
parent4a27f44f48c8d9b0cc7e58215bdd563faea3e748 (diff)
General hint for noncapitalised variables added.
Diffstat (limited to 'prolog/common.py')
-rw-r--r--prolog/common.py38
1 files changed, 31 insertions, 7 deletions
diff --git a/prolog/common.py b/prolog/common.py
index 4636936..65fc218 100644
--- a/prolog/common.py
+++ b/prolog/common.py
@@ -16,14 +16,38 @@ hint_type = {
'monkey_change': HintPopup('monkey_change', style='change'),
'monkey_insert': HintPopup('monkey_insert', style='insert'),
'monkey_remove': HintPopup('monkey_remove', style='remove'),
+ 'noncapitalised_variable': Hint('noncapitalised_variable'),
+ 'noncapitalised_variable_markup': HintPopup('noncapitalised_variable_markup'),
}
def hint(code, aux_code):
- # Check program for syntax errors.
- engine_id, output = prolog.engine.create(code=code)
- if engine_id is not None:
- prolog.engine.destroy(engine_id)
- if 'error' in map(operator.itemgetter(0), output):
- errors_msg = '\n'.join(['{}: {}'.format(m_type, m_text) for m_type, m_text in output])
- return [{'id': 'syntax_error', 'args': {'messages': errors_msg}}]
+
+ try:
+ engine_id, output = prolog.engine.create(code=code+aux_code, timeout=1.0)
+
+ # Check program for syntax errors.
+ if 'error' in map(operator.itemgetter(0), output):
+ errors_msg = '\n'.join(['{}: {}'.format(m_type, m_text) for m_type, m_text in output])
+ return [{'id': 'syntax_error', 'args': {'messages': errors_msg}}]
+
+ tokens = prolog.util.tokenize(code)
+
+ # a,b,c are a bit dangerous when crossing the river exercise is being solved
+ # what about potential numbers after letters?
+ # this will have to be solved more generally
+ targets = [prolog.util.Token('NAME', 'x'), prolog.util.Token('NAME', 'y'),
+ prolog.util.Token('NAME', 'z'), prolog.util.Token('NAME', 'a'),
+ prolog.util.Token('NAME', 'b'), prolog.util.Token('NAME', 'c')]
+ marks = [(t.pos, t.pos + len(t.val)) for t in tokens if t in targets]
+ if marks:
+ return [{'id': 'noncapitalised_variable_markup', 'start': m[0], 'end': m[1]} for m in marks] + \
+ [{'id': 'noncapitalised_variable'}]
+
+ except socket.timeout as ex:
+ pass
+
+ finally:
+ if engine_id is not None:
+ prolog.engine.destroy(engine_id)
+
return []