find_package(FLEX REQUIRED)
find_package(BISON REQUIRED)

set(PSLANG_LEXER_RULES_FILE  "${CMAKE_CURRENT_SOURCE_DIR}/rules/pslang.l")
set(PSLANG_PARSER_RULES_FILE "${CMAKE_CURRENT_SOURCE_DIR}/rules/pslang.y")

set(PSLANG_LEXER_HEADER_FILE "${CMAKE_CURRENT_BINARY_DIR}/generated/gen_lexer.hpp")
set(PSLANG_LEXER_SOURCE_FILE "${CMAKE_CURRENT_BINARY_DIR}/generated/gen_lexer.cpp")

set(PSLANG_PARSER_HEADER_FILE "${CMAKE_CURRENT_BINARY_DIR}/generated/gen_parser.hpp")
set(PSLANG_PARSER_SOURCE_FILE "${CMAKE_CURRENT_BINARY_DIR}/generated/gen_parser.cpp")

file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/generated")

flex_target(
	generate-pslang-lexer
	${PSLANG_LEXER_RULES_FILE}
	${PSLANG_LEXER_SOURCE_FILE}
	DEFINES_FILE ${PSLANG_LEXER_HEADER_FILE}
)

bison_target(
	generate-pslang-parser
	${PSLANG_PARSER_RULES_FILE}
	${PSLANG_PARSER_SOURCE_FILE}
	DEFINES_FILE ${PSLANG_PARSER_HEADER_FILE}
	COMPILE_FLAGS -Wcounterexamples
)

add_flex_bison_dependency(generate-pslang-lexer generate-pslang-parser)

set(PSLANG_PARSER_RULE_FILES
	${PSLANG_LEXER_RULES_FILE}
	${PSLANG_PARSER_RULES_FILE}
)

set(PSLANG_PARSER_GENERATED_FILES
	${PSLANG_LEXER_HEADER_FILE}
	${PSLANG_LEXER_SOURCE_FILE}
	${PSLANG_PARSER_HEADER_FILE}
	${PSLANG_PARSER_SOURCE_FILE}
)

file(GLOB_RECURSE PSLANG_PARSER_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp")
file(GLOB_RECURSE PSLANG_PARSER_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp")

add_library(pslang-parser STATIC ${PSLANG_PARSER_HEADERS} ${PSLANG_PARSER_SOURCES} ${PSLANG_PARSER_RULE_FILES} ${PSLANG_PARSER_GENERATED_FILES})
target_include_directories(pslang-parser PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}/generated")
target_link_libraries(pslang-parser pslang-ast)
