@Override public void check() { List<TreeNode> children = getChildren(); if (children.size() == 1) { // IDN String errorMessage = "<izravni_deklarator> ::= " + children.get(0); Checker.throwException(!nType.equals("void"), errorMessage); String name = ((TerminalSignData) children.get(0).getData()).getValue(); Checker.throwException(!Checker.isNameDeclaredLocaly(name), errorMessage); boolean lExpression = Checker.canBeLExpression(nType); Scope.currentScope.addIdentificator(name, nType, lExpression); type = nType; } else { if (children.get(1).getData().getName().equals("L_UGL_ZAGRADA")) { // IDN L_UGL_ZAGRADA BROJ D_UGL_ZAGRADA String errorMessage = "<izravni_deklarator> ::= " + children.get(0) + " " + children.get(1) + " " + children.get(2) + " " + children.get(3); Checker.throwException(!nType.equals("void"), errorMessage); String name = ((TerminalSignData) children.get(0).getData()).getValue(); Checker.throwException(!Checker.isNameDeclaredLocaly(name), errorMessage); String sizeNumber = ((TerminalSignData) children.get(2).getData()).getValue(); Checker.throwException(Checker.checkArraySizeInteger(sizeNumber), errorMessage); elementCount = Checker.getNumberValue(sizeNumber); this.type = nType + "[]"; Scope.currentScope.addIdentificator(name, type, false); } else if (children.get(2).getData().getName().equals("KR_VOID")) { // IDN L_ZAGRADA KR_VOID D_ZAGRADA String errorMessage = "<izravni_deklarator> ::= " + children.get(0) + " " + children.get(1) + " " + children.get(2) + " " + children.get(3); String name = ((TerminalSignData) children.get(0).getData()).getValue(); this.type = "f(void->" + nType + ")"; if (Checker.isFunctionDeclaredLocaly(name)) { Checker.throwException(Checker.getFunction(name).getType().equals(type), errorMessage); } else { boolean defined = Checker.isFunctionDefined(name); Scope.currentScope.addFunction(name, type, defined); } } else { // IDN L_ZAGRADA <lista_parametara> D_ZAGRADA String errorMessage = "<izravni_deklarator> ::= " + children.get(0) + " " + children.get(1) + " <lista_parametara> " + children.get(3); ParameterList parameterList = (ParameterList) children.get(2); parameterList.check(); String name = ((TerminalSignData) children.get(0).getData()).getValue(); StringBuffer typeBuffer = new StringBuffer("f("); for (ParameterList.Parameter parameter : parameterList.getParameters()) { typeBuffer.append(parameter.getType() + ","); } typeBuffer.deleteCharAt(typeBuffer.length() - 1); typeBuffer.append("->").append(nType).append(")"); this.type = typeBuffer.toString(); if (Checker.isFunctionDeclaredLocaly(name)) { Checker.throwException(Checker.getFunction(name).getType().equals(type), errorMessage); } else { boolean defined = Checker.isFunctionDefined(name); Scope.currentScope.addFunction(name, type, defined); } } } }