О Mac OS X Я смог решить эту проблему, установив переменную JAVA_HOME:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
Вы говорите: «Это должно быть 9var
как идентификатор». Но тогда вы указываете, что 9var
не соответствует шаблону регулярного выражения ID. Итак, почему 9var
сканируется как идентификатор?
Если вы хотите, чтобы 9var
был идентификатором, было бы достаточно легко изменить регулярное выражение от [a-zA-Z_][a-zA-Z_0-9]*
до [a-zA-Z_0-9]+
. (Это также будет соответствовать чистым целым числам, поэтому вам нужно будет убедиться, что сначала применяется шаблон INT. В качестве альтернативы вы можете использовать [a-zA-Z_0-9]*[a-zA-Z_][a-zA-Z_0-9]*
.)
Я подозреваю, что вы действительно хотите для 9var
, чтобы распознаваться как лексическая ошибка, а не ошибка синтаксического анализа. Но если это будет признано как ошибка в любом случае, действительно ли имеет значение, является ли это лексической ошибкой или синтаксической ошибкой?
Стоит отметить, что лексер Python работает именно так, как ваш лексер делает: он сканирует 9var
как два токена, и это позже создаст синтаксическую ошибку.
Конечно, возможно, что на вашем языке существует синтаксически правильная конструкция, в которой идентификатор может непосредственно следуйте за INT. Или, если нет, где ключевое слово может непосредственно следовать за INT, например, выражение Python 3 if x else 2
. (Опять же, Python не жалуется, если вы пишете это как 3if x else 2
.)
Итак, если вы действительно настаиваете на том, чтобы пометить ошибку сканера для токенов, которые начинаются с цифры и продолжаются без цифр, вы можете вставить другой шаблон, например [0-9]+[a-zA-Z_][a-zA-Z_0-9]*
, и заставить его вызвать ошибку в своем действии.